• C#通过简单的Http服务上传下载图片。


    大概的流程如下图所示:

    1  服务端使用HttpListener类 监听客户端的连接请求。

       HttpListener Listerner = new HttpListener();

     

      服务端新开一个线程,无限循环监听客户端的连接请求。

     

         while (true)

         {

             HttpListenerContext Request=  Listerner.GetContext();  

             ThreadPool.QueueUserWorkItem(ProcessRequest, Request);  

     

          }

     

       Listerner.GetContext()函数在没有连接到来的时候,会挂起当前的线程。

       当有连接到来的时候, 利用线程池,把连接请求抛给ProcessRequest函数处理。

     

         private void ProcessRequest(object listenerContext)

           {

                var context = (HttpListenerContext)listenerContext;

                new ClsProcessRequest().Begin(context);

           

          }

     

       ProcessRequest函数新建一个ClsProcessRequest对象,并调用Begin方法对连接请求进行处理。

       ClsProcessRequest类获取客户端传过来的url信息。

       Begin()函数获取URL的信息:

       this.context = context;

       this.context.Response.StatusCode = 200;//设置返回给客服端http状态代码

       DataLen =  Convert.ToInt32(context.Request.ContentLength64);

       filename = Path.GetFileName(context.Request.RawUrl);

      System.Diagnostics.Debug.WriteLine("原始url:" + context.Request.RawUrl);

      System.Diagnostics.Debug.WriteLine("字符总大小:" + DataLen.ToString());

      System.Diagnostics.Debug.WriteLine("客户端的IP:" +context.Request.RemoteEndPoint.ToString());

      System.Diagnostics.Debug.WriteLine("上传的文件名:" + filename);

     

     

     

     http上传下载的请求用以下的函数封装:

     public static string  PackMessage(HttpClsMessage MyHttpClsMessage)
            {

                string All = Start + "|"

                        + MyHttpClsMessage.SNNumber +
                    "|" + MyHttpClsMessage.ComType +
                    "|" + MyHttpClsMessage.Data +
                    "|" +MyHttpClsMessage.DownFileName+
                    "|" +MyHttpClsMessage.UploadFileName
                    
                     +"|" + End;


                return All;

            }

    Start变量为:S-T-A-R-T

    SNNumber:空字符

    ComType:UPLOADFILE为上传图片,DOWNLOADFILE为下载文件

    Data:空

    DownFileNmae:请求下载的图片文件名

    UploadFileName:上传的图片文件名

    End变量:E-N-D

    上传图片:

    原始url:/S-T-A-R-T%7C%7CUPLOADFILE%7C%7C%7C130035953323906250.jpg%7CE-N-D

    字符总大小:14736

    客户端的IP:192.168.1.31:1604

    上传的文件名:S-T-A-R-T%7C%7CUPLOADFILE%7C%7C%7C130035953323906250.jpg%7CE-N-D

    收到的字符大小:1460

    收到的字符大小:8192

    收到的字符大小:5084

    收到的字符大小:0

    发送消息给浏览器。

    输入流关闭了。

    输出流关闭了。

     

    从输出可以看到信息:

    是一个上传图片的URL请求,%7C也就是字符 ‘| ‘

     

     上传的图片文件用匿名方法BeginRead读取并写入图片文件中。

      context.Request.InputStream.BeginRead(MyBytes, 0, MyBytes.Length, ReadCallback, null);

      using (Stream stream = new FileStream(SecondSubFolder + MyHttpClsMessage.UploadFileName, FileMode.Append, FileAccess.Write))

                      {

                          //将字符信息写入文件系统

                          stream.Write(MyBytes, 0, ReadSize);

                      }

     

     

    下载图片

    原始url:/S-T-A-R-T%7C%7CDOWNFILE%7C%7C7758258.jpg%7C%7CE-N-D

    字符总大小:0

    客户端的IP:192.168.1.31:3083

    上传的文件名:S-T-A-R-T%7C%7CDOWNFILE%7C%7C7758258.jpg%7C%7CE-N-D

     

    从输出可以看到信息:

    是一个下载图片的URL请求,%7C也就是字符 ‘| ‘

     

              using (System.IO.FileStream fs = new FileStream(FullFileName, FileMode.Open, FileAccess.Read))

                      {

                          byte[] picbyte = new byte[fs.Length];

                          using (BinaryReader br = new BinaryReader(fs))

                          {

                              picbyte = br.ReadBytes(Convert.ToInt32(fs.Length));

                              Write(picbyte);

                          }

                      }

     

    读取文件流,发送给客户端。

    -----------------------------------------------------------------------------------------------

    演示图:

    源代码下载:

     /Files/gogosai/HttpServerPool.rar

    VS2008下编译通过

      

     
     
    分类: C#
  • 相关阅读:
    连载:面向对象葵花宝典:思想、技巧与实践(2)
    关于虚拟化一些思考——不应该盲目使用
    Zimbra8.x邮件服务器安装及配置
    CodeForces 371D. Vessels
    【建模】UML类关系分析
    公式提取软件mathpix
    ROS多线程编程
    ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle
    ROS 日志消息(C++)
    Python 中的 if __name__ == '__main__' 该如何理解
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2878950.html
Copyright © 2020-2023  润新知