欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

要實(shí)現(xiàn)了Web Server,通過(guò)以下幾句代碼瀏覽器訪(fǎng)問(wèn)就可以獲得訪(fǎng)問(wèn)的數(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ā)來(lái)的數(shù)據(jù),限定為 4K。
  int length = socket.Receive(data, 0, data.Length, SocketFlags.None);
  socket.Send(Encoding.UTF8.GetBytes("歡迎訪(fǎng)問(wèn) 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);

但以上只是原理,實(shí)際會(huì)很復(fù)雜,不過(guò)就算我們要做簡(jiǎn)單的 Web Server,還是需要解決兩個(gè)問(wèn)題:

一、輸出 HTTP 頭

byte[] body = Encoding.UTF8.GetBytes("歡迎訪(fǎng)問(wèn) 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);

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

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

格式一定要正確,否則影響瀏覽器對(duì) HTTP 頭和 HTTP 體的識(shí)別。

二、請(qǐng)求 HTTP 頭

到目前為止,我們還不知道瀏覽器中輸入的 URL 是什么呢。請(qǐng)求的 HTTP 頭也是有特定格式的,我們只需要將其獲取出來(lái),進(jìn)行拆解,就可以獲取 URL 了。

拆解不是難事,我們說(shuō)一說(shuō)如何獲取吧。前面的 data、length 不是一直沒(méi)用么?如下:

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ā)來(lái)的數(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é)

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

相關(guān)文章

  • C#切換鼠標(biāo)左右鍵習(xí)慣無(wú)需控制面板中修改

    C#切換鼠標(biāo)左右鍵習(xí)慣無(wú)需控制面板中修改

    本人一直喜歡左手使用鼠標(biāo),偶爾同事會(huì)臨時(shí)操作一下,因?yàn)樗牧?xí)慣是右手,還得在控制面板里進(jìn)行更改,太麻煩了所以就編寫(xiě)一個(gè)控制臺(tái)程序,雙擊一下即可切換左右鍵,熱愛(ài)懶人的你可不要錯(cuò)過(guò)了哈
    2013-02-02
  • c#模擬銀行atm機(jī)示例分享

    c#模擬銀行atm機(jī)示例分享

    這篇文章主要介紹了c#模擬銀行atm機(jī)示例,實(shí)現(xiàn)了用戶(hù)登錄、用戶(hù)存款、用戶(hù)取款等功能,需要的朋友可以參考下
    2014-03-03
  • C#下解析HTML的兩種方法介紹

    C#下解析HTML的兩種方法介紹

    用System.Net.WebClient下載Web Page存到本地文件或者String中,用正則表達(dá)式來(lái)分析。這個(gè)方法可以用在Web Crawler等需要分析很多Web Page的應(yīng)用中
    2013-09-09
  • C#9.0推出的4個(gè)新特性介紹

    C#9.0推出的4個(gè)新特性介紹

    這篇文章介紹了C#9.0推出的4個(gè)新特性,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Unity實(shí)現(xiàn)局域網(wǎng)聊天室功能

    Unity實(shí)現(xiàn)局域網(wǎng)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)局域網(wǎng)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框

    C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-03-03
  • C#實(shí)現(xiàn)流程圖設(shè)計(jì)器

    C#實(shí)現(xiàn)流程圖設(shè)計(jì)器

    這篇文章主要介紹了C#實(shí)現(xiàn)流程圖設(shè)計(jì)器,感興趣的小伙伴們可以參考一下
    2015-11-11
  • c#實(shí)現(xiàn)把異常寫(xiě)入日志示例(異常日志)

    c#實(shí)現(xiàn)把異常寫(xiě)入日志示例(異常日志)

    這篇文章主要介紹了c#實(shí)現(xiàn)把異常寫(xiě)入日志示例(異常日志),需要的朋友可以參考下
    2014-04-04
  • c# 使用異步編程的方法

    c# 使用異步編程的方法

    這篇文章主要介紹了c# 使用異步編程的方法,文中講解非常細(xì)致,幫助大家更好的理解c# 異步編程,感興趣的朋友可以了解下
    2020-08-08
  • C#獲取Excel第一列的實(shí)例方法

    C#獲取Excel第一列的實(shí)例方法

    在本篇文章里小編給各位分享了關(guān)于C# 怎么獲取Excel第一列的實(shí)例方法和代碼,需要的朋友們可以學(xué)習(xí)下。
    2019-08-08

最新評(píng)論