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下编译通过

 

 

  

posted @ 2013-01-27 11:55  fujiwara_sai  阅读(16064)  评论(12编辑  收藏  举报