C# Socket 模拟http服务器帮助类

Posted Supper litt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# Socket 模拟http服务器帮助类相关的知识,希望对你有一定的参考价值。

0x01 写在前面

0x02 Http协议

0x03 TCP/IP

0x04 看代码

0x05 总结

0x01 写在前面

  由于工作中,经常需要在服务器之间,或者进程之间进行通信,分配任务等。用Socket操作,太麻烦了,需要建立连接,处理消息。所以

准备创建一个Socket模拟Http服务器的帮助类,来直接通过WebClient进行调用。

0x02 Http协议

我的理解:http协议,其实就是依托于tcp/ip的一个协议,也是可以通过socket发送消息,只是说。发送的内容格式满足http的条件,就可以被理解成http协议。

常用Http头。 Http版本也是可以写成1.1的。

HTTP/1.0 200 OK
Content-Type: text/html
Connection: keep-alive
Content-Encoding: utf-8

0x03 TCP/IP

我的理解:TCP/IP协议其实是某一类协议的大分类了,很多协议都是基于这个协议来传递消息的。更详细的信息,自己搜索一下。

0x04 看代码

SocketHttpHelper.cs  socket模拟http帮助类

  1 public class SocketHttpHelper
  2 {
  3     private string ip = "127.0.0.1";
  4     private int port = 8123;
  5     private int count = 0;
  6     private Socket server = null;
  7 
  8     public string DefaultReturn = string.Empty;
  9 
 10     public event Func<string, string, string> Handler = null;
 11 
 12     public SocketHttpHelper()
 13     {
 14     }
 15 
 16     public SocketHttpHelper(string ip, int port)
 17     {
 18         this.ip = ip;
 19         this.port = port;
 20     }
 21 
 22     public void StartListen(int count = 10)
 23     {
 24         this.count = count;
 25         Thread t = new Thread(new ThreadStart(ProcessThread));
 26         t.IsBackground = true;
 27         t.Start();
 28     }
 29 
 30     public void CloseSocket()
 31     {
 32         try
 33         {
 34             server.Close();
 35         }
 36         catch { }
 37     }
 38 
 39     private void ProcessThread()
 40     {
 41         server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 42         server.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ip), port));
 43         server.Listen(count);
 44         while (true)
 45         {
 46             try
 47             {
 48                 Socket client = server.Accept();
 49                 ThreadPool.QueueUserWorkItem(new WaitCallback(ListenExecute), client);
 50             }
 51             catch { }
 52             finally
 53             {
 54             }
 55         }
 56     }
 57 
 58     private void ListenExecute(object obj)
 59     {
 60         Socket client = obj as Socket;
 61         try
 62         {
 63             string ip = (client.RemoteEndPoint as System.Net.IPEndPoint).Address.ToString();
 64             byte[] buffer = new byte[1024];
 65             int count = client.Receive(buffer);
 66             if (count > 0)
 67             {
 68                 string content = Encoding.UTF8.GetString(buffer, 0, count);
 69 
 70                 // 解析 content
 71                 Regex actionRegex = new Regex(@"GET\\s+/(?<action>\\w+)\\?(?<args>[^\\s]{0,})");
 72                 string action = actionRegex.Match(content).Groups["action"].Value;
 73                 string args = actionRegex.Match(content).Groups["args"].Value;
 74                 string headStr = @"HTTP/1.0 200 OK
 75 Content-Type: text/html
 76 Connection: keep-alive
 77 Content-Encoding: utf-8
 78 
 79 ";
 80                 if (Handler != null)
 81                 {
 82                     try
 83                     {
 84                         string result = Handler(action, args);
 85                         string data = string.Format(headStr + result);
 86                         client.Send(Encoding.UTF8.GetBytes(data));
 87                     }
 88                     catch { }
 89                     finally
 90                     {
 91                     }
 92                 }
 93                 else
 94                 {
 95                     string data = string.Format(headStr + DefaultReturn);
 96                     client.Send(Encoding.UTF8.GetBytes(data));
 97                 }
 98             }
 99         }
100         catch { }
101         finally
102         {
103             try
104             {
105                 client.Shutdown(SocketShutdown.Both);
106                 client.Close();
107                 client.Dispose();
108             }
109             catch { }
110         }
111     }
112 }
View Code

0x05 总结

由于,每次都要从Socket开始写,写多了才发现,原来需要写一个公用类,点都不费时间。

以上是关于C# Socket 模拟http服务器帮助类的主要内容,如果未能解决你的问题,请参考以下文章

C# Socket学习-构建Socket服务器

你也可以写个服务器 - C# Socket学习2

记一次使用Socket模拟HTTP请求

C# socket接收 http返回

C# 你也可以写个服务器

转C# 使用消息队列,包括远程访问