官术网_书友最值得收藏!

1.2.2 基于TcpListener的Web服務(wù)器

為了簡化基于TCP協(xié)議的監(jiān)聽程序,.NET在System.Net.Sockets命名空間中提供了TcpListener類,使用它,在構(gòu)造函數(shù)中傳遞一組網(wǎng)絡(luò)端點(diǎn)信息就可以準(zhǔn)備好監(jiān)聽參數(shù),而不再需要設(shè)置使用的網(wǎng)絡(luò)協(xié)議等細(xì)節(jié),調(diào)用Start方法之后,監(jiān)聽工作就開始了。AcceptTcpClient方法將阻塞進(jìn)程,直到一個(gè)客戶端的連接到達(dá)監(jiān)聽器,這個(gè)方法將返回一個(gè)代表客戶端連接的代理對象,它的類型為TCPClient,我們可以通過它與客戶端進(jìn)行通信。

在輸入輸出部分,通過TcpClient對象可以得到一個(gè)用于輸入和輸出的網(wǎng)絡(luò)流對象NetworkStream,這是一個(gè)派生自Stream對象的字節(jié)流對象,對Socket的輸入和輸出進(jìn)行了封裝,這樣,我們可以通過常用的字節(jié)流操作來完成網(wǎng)絡(luò)的輸入和輸出,如下面的代碼所示:

// 取得本機(jī)的 loopback 網(wǎng)絡(luò)地址,即 127.0.0.1
IPAddress address = IPAddress.Loopback;
// 創(chuàng)建可以訪問的端點(diǎn),49152 表示端口號
IPEndPoint endPoint = new IPEndPoint(address, 49152);
// 創(chuàng)建 TCP 監(jiān)聽器
TcpListener newserver = new TcpListener(endPoint);
// 啟動監(jiān)聽器
newserver.Start();
Console.WriteLine(" 開始監(jiān)聽...");
while (true)
{
  // 等待客戶端連接
  TcpClient newclient = newserver.AcceptTcpClient();
  Console.WriteLine(" 已經(jīng)建立連接! ");
  // 得到一個(gè)網(wǎng)絡(luò)流
  NetworkStream ns = newclient.GetStream();
  // 處理過程中使用 UTF-8 編碼
  System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
  byte[]request = new byte[4096];
  int length = ns.Read(request, 0, 4096);
  string requestString = utf8.GetString(request, 0, length);
  Console.WriteLine(requestString);
  //狀態(tài)行
  string statusLine = "HTTP/1.1 200 OK\r\n";
  byte[]statusLineBytes = utf8.GetBytes(statusLine);
  // 準(zhǔn)備發(fā)送到客戶端的網(wǎng)頁
  string responseBody ="<html><head><title>From Socket
         Server</title></head><body><h1>Hello, world. </h1></body></html> ";
  byte[]responseBodyBytes = utf8.GetBytes(responseBody);
  // 回應(yīng)的頭部
  string responseHeader =
      string.Format(
          "Content-Type: text/html;
              charset = UTF-8\r\nContent-Length:{0}\r\n",
          responseBody.Length
         );
  byte[]responseHeaderBytes = utf8.GetBytes(responseHeader);
  // 輸出回應(yīng)的狀態(tài)行
  ns.Write(statusLineBytes, 0, statusLineBytes.Length);
  // 輸出回應(yīng)的頭部
  ns.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
  // 輸出回應(yīng)頭部與內(nèi)容之間的空行
  ns.Write(new byte[]{13, 10}, 0, 2);
  // 輸出內(nèi)容部分
  ns.Write(responseBodyBytes, 0, responseBodyBytes.Length);
  // 關(guān)閉與客戶端的連接
  newclient.Close();
  if (Console.KeyAvailable)
    break;
}
// 關(guān)閉服務(wù)器
newserver.Stop();

程序的處理效果與使用Socket相同。

主站蜘蛛池模板: 溆浦县| 郎溪县| 容城县| 漳平市| 孙吴县| 米泉市| 宜君县| 湖北省| 万宁市| 丰宁| 嘉祥县| 汾西县| 济阳县| 中牟县| 康定县| 昆明市| 游戏| 达孜县| 仁怀市| 宝兴县| 保康县| 嘉祥县| 高台县| 谢通门县| 光山县| 锦州市| 应城市| 元谋县| 克山县| 洞头县| 准格尔旗| 大丰市| 永川市| 嘉黎县| 凌海市| 瑞金市| 昆明市| 灵寿县| 叙永县| 灵山县| 合水县|