国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#創建一個小型Web Server(Socket實現)

2019-10-29 21:13:20
字體:
來源:轉載
供稿:網友

要實現了Web Server,通過以下幾句代碼瀏覽器訪問就可以獲得訪問的數據。

class="jb51code">
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 頭

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 OKContent-Length: " + body.Length + @"Content-Type: text/plainDate: " + 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 不是一直沒用么?如下:

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

完整代碼

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 OKContent-Length: " + body.Length + @"Content-Type: text/plainDate: " + 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#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 香河县| 城市| 湟源县| 海伦市| 桐城市| 军事| 饶河县| 固始县| 九寨沟县| 涿鹿县| 淄博市| 石楼县| 渝北区| 四会市| 宾川县| 诸城市| 中超| 夏邑县| 班戈县| 濮阳县| 隆德县| 金坛市| 潼关县| 西乌珠穆沁旗| 桃源县| 麻江县| 玛曲县| 南投市| 神木县| 永川市| 鄄城县| 北碚区| 南城县| 云霄县| 望奎县| 固原市| 淮安市| 定兴县| 大关县| 竹北市| 抚顺县|