首頁 >後端開發 >C#.Net教程 >C#使用Socket建立一個小型的Web Server程式碼分享

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

黄舟
黄舟原創
2017-03-21 11:40:111893瀏覽

這篇文章主要介紹了關於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 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + 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 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + 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#使用Socket建立一個小型的Web Server程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn