C#使用Socket创建一个小型的Web Server代码分享


本文摘自PHP中文网,作者黄舟,侵删。

这篇文章主要介绍了关于C#利用Socket实现创建一个小型Web Server的相关资料,文中通过示例代码介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。

要实现了Web Server,通过以下几句代码浏览器访问就可以获得访问的数据。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));

socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。

 

Thread thread = new Thread(delegate(object obj)

{

 Socket socketListen = (Socket)obj;

 while (true)

 {

  Socket socket = socketListen.Accept();

  byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据,限定为 4K。

  int length = socket.Receive(data, 0, data.Length, SocketFlags.None);

  socket.Send(Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));

  socket.Shutdown(SocketShutdown.Both);

  socket.Close();

 }

});

 

thread.IsBackground = true;

thread.Start(socketWatch);

但以上只是原理,实际会很复杂,不过就算我们要做简单的 Web Server,还是需要解决两个问题:

一、输出 HTTP 头

1

2

3

4

5

6

7

8

9

10

byte[] body = Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK

Content-Length: " + body.Length + @"

Content-Type: text/plain

Date: " + string.Format("{0:R}", DateTime.Now) + @"

Server: Cftea Web Server

 

");

socket.Send(head);

socket.Send(body);

只要有特定的格式,就会被浏览器当作 HTTP 头对待。HTTP 头的格式为:

  • 第一行:HTTP/1.x + 空格 + 状态码 + 空格 + 描述

  • 中间行:名称 + 冒号 + 空格(也可以省略) + 值

  • 最后行:空行

格式一定要正确,否则影响浏览器对 HTTP 头和 HTTP 体的识别。

二、请求 HTTP 头

到目前为止,我们还不知道浏览器中输入的 URL 是什么呢。请求的 HTTP 头也是有特定格式的,我们只需要将其获取出来,进行拆解,就可以获取 URL 了。

拆解不是难事,我们说一说如何获取吧。前面的 data、length 不是一直没用么?如下:

1

string requestText = Encoding.UTF8.GetString(data, 0, length);

完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));

socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。

 

Thread thread = new Thread(delegate(object obj)

{

 Socket socketListen = (Socket)obj;

 while (true)

 {

  using (Socket socket = socketListen.Accept())

  {

   byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据

   int length = socket.Receive(data, 0, data.Length, SocketFlags.None);

   if (length > 0)

   {

    string requestText = Encoding.UTF8.GetString(data, 0, length);

 

    byte[] body = Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

    byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK

Content-Length: " + body.Length + @"

Content-Type: text/plain

Date: " + string.Format("{0:R}", DateTime.Now) + @"

Server: Cftea Web Server

 

");

    socket.Send(head);

    socket.Send(body);

   }

 

   socket.Shutdown(SocketShutdown.Both);

   socket.Close();

  }

 }

});

 

thread.IsBackground = true;

thread.Start(socketWatch);

总结

以上就是C#使用Socket创建一个小型的Web Server代码分享的详细内容!

相关阅读 >>

详细介绍C#实现的md5加密功能与用法示例

C#教程】C# 多态性

C#与vb.net混合开发测试的详细介绍(图文)

详细介绍C#该行已经属于另一个表的解决方法

详解C#winform程序自动更新实现方法(图)

socket传输protobuf字节流实例教程

C# socket实现简单控制台案例

C#如何将datatable中的列名复制到另一个datatable

C#开发 winform如何在选项卡中集成加载多个窗体 实现窗体复用详解(图)

C#开发实例-订制屏幕截图工具(一)功能概览(图)

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...