0x01 寫在前面
0x02 Http協議
0x03 TCP/IP
0x04 看代碼
0x05 總結
由於工作中,經常需要在服務器之間,或者進程之間進行通信,分配任務等。用Socket操作,太麻煩了,需要建立連接,處理消息。所以
准備創建一個Socket模擬Http服務器的幫助類,來直接通過WebClient進行調用。
我的理解: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
我的理解:TCP/IP協議其實是某一類協議的大分類了,很多協議都是基於這個協議來傳遞消息的。更詳細的信息,自己搜索一下。
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由於,每次都要從Socket開始寫,寫多了才發現,原來需要寫一個公用類,點都不費時間。