1 Star 2 Fork 2

Kenneth / HttpServerPool

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

#HttpServerPool

大概的流程如下图所示:

输入图片说明

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);

                  }

              }

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


演示图:

输入图片说明

输入图片说明

空文件

简介

C#通过简单的Http服务上传下载图片 展开 收起
C#
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C#
1
https://gitee.com/yunmeng/HttpServerPool.git
git@gitee.com:yunmeng/HttpServerPool.git
yunmeng
HttpServerPool
HttpServerPool
master

搜索帮助

14c37bed 8189591 565d56ea 8189591