最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#創(chuàng)建一個小型Web Server(Socket實現(xiàn))

 更新時間:2017年02月20日 14:15:47   作者:千一網(wǎng)絡(luò)  
這篇文章主要介紹了關(guān)于C#利用Socket實現(xiàn)創(chuàng)建一個小型Web Server的相關(guān)資料,文中通過示例代碼介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。

要實現(xiàn)了Web Server,通過以下幾句代碼瀏覽器訪問就可以獲得訪問的數(shù)據(jù)。

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
socketWatch.Listen(20); // 參數(shù)表示最多可容納的等待接受的傳入連接數(shù),不包含已經(jīng)建立連接的。

Thread thread = new Thread(delegate(object obj)
{
 Socket socketListen = (Socket)obj;
 while (true)
 {
  Socket socket = socketListen.Accept();
  byte[] data = new byte[1024 * 1024 * 4]; // 瀏覽器發(fā)來的數(shù)據(jù),限定為 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);

但以上只是原理,實際會很復(fù)雜,不過就算我們要做簡單的 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);

只要有特定的格式,就會被瀏覽器當(dāng)作 HTTP 頭對待。HTTP 頭的格式為:

  • 第一行:HTTP/1.x + 空格 + 狀態(tài)碼 + 空格 + 描述
  • 中間行:名稱 + 冒號 + 空格(也可以省略) + 值
  • 最后行:空行

格式一定要正確,否則影響瀏覽器對 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); // 參數(shù)表示最多可容納的等待接受的傳入連接數(shù),不包含已經(jīng)建立連接的。

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]; // 瀏覽器發(fā)來的數(shù)據(jù)
   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);

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

最新評論

文山县| 漳平市| 林州市| 庆城县| 汤阴县| 车险| 勃利县| 广南县| 民县| 垦利县| 小金县| 阿城市| 阜宁县| 邓州市| 佛山市| 诸城市| 景德镇市| 新泰市| 乌鲁木齐县| 贵阳市| 盐城市| 财经| 临颍县| 漾濞| 宜宾市| 厦门市| 通海县| 台湾省| 婺源县| 蒲城县| 望奎县| 鄂尔多斯市| 探索| 林西县| 虞城县| 建平县| 湖南省| 雷波县| 固安县| 大田县| 铜山县|