程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# Socket 模擬http服務器幫助類,

C# Socket 模擬http服務器幫助類,

編輯:C#入門知識

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開始寫,寫多了才發現,原來需要寫一個公用類,點都不費時間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved