C#使用Socket建立一個小型的Web Server代碼分享

來源:互聯網
上載者:User
這篇文章主要介紹了關於C#利用Socket實現建立一個小型Web Server的相關資料,文中通過範例程式碼介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。

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

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);

總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.