基於TcpListener的web伺服器

lvxfcjf發表於2021-09-09

寫在前面

上篇文章根據《asp.net 本質論》書上提供的例子,實現了一個簡單的web伺服器,本篇文章將介紹另一種實現方式——基於TcpListener的web伺服器。

TcpListener

名稱空間System.Net.Sockets下的TcpListener類簡化了基於tcp協議的監聽程式。

圖片描述

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;namespace TcpListenerWebServer
{    class Program
   {        static void Main(string[] args)
       {            //取得本機的loopback網路地址,即127.0.0.1
           IPAddress ip = IPAddress.Loopback;            //建立可以訪問的網路端點,8888表示埠號
           IPEndPoint endpoint = new IPEndPoint(ip, 8888);            //初始化tcp監聽器
           
           TcpListener listener = new TcpListener(endpoint);            //開啟監聽器            listener.Start();            //列印提示
           Console.WriteLine("監聽開始......");            while (true)
           {                //AcceptTcpClient方法將阻塞程式,直到一個客戶端的連線到達監聽器,返回一個TcpClient型別的物件。可透過該物件與客戶端進行通訊
               TcpClient client = listener.AcceptTcpClient();
               Console.WriteLine("與客戶端已經建立連線.....");                //得到一個網路流,透過TcpClient可以得到一個用於輸入和輸出的網路流物件NetworkStream,對Socket的輸入和輸出進行了封裝。
               NetworkStream ns = client.GetStream();                //處理過程使用utf8 進行編碼
               System.Text.Encoding utf8 = System.Text.Encoding.UTF8;                //設定用於接收的位元組陣列
               byte[] buffer = new byte[4096];                int length = ns.Read(buffer, 0, buffer.Length);                //得到請求內容
               string requestString = utf8.GetString(buffer, 0, length);                //列印                Console.WriteLine(requestString);                //回應的狀態行
               string statusLine = "HTTP/1.1 200 OKrn";                byte[] statusLineBuffer = utf8.GetBytes(statusLine);                //準備傳送到客戶端的網頁
               string responseBody = " 這是一個web伺服器的測試

Hello World.

";                byte[] responseBodyBuffer = utf8.GetBytes(responseBody);                //回應的頭部
               string responseHeader = string.Format(                    "Content-Type:text/html;charset=UTF-8rnContent-Length: {0}rn", responseBodyBuffer.Length);                byte[] responseHeaderBuffer = utf8.GetBytes(responseHeader);                //響應狀態行
               ns.Write(statusLineBuffer, 0, statusLineBuffer.Length);                //響應頭部
               ns.Write(responseHeaderBuffer, 0, responseHeaderBuffer.Length);                //輸出頭部與內容之間的空行
               ns.Write(new byte[] { 13, 10 }, 0, 2);                //輸出內容部分
               ns.Write(responseBodyBuffer, 0, responseBodyBuffer.Length);                //關閉與客戶端的連線                client.Close();                break;
           }            //關閉伺服器監聽            listener.Stop();
           Console.Read();
       }
   }
}

圖片描述

啟動伺服器,並在瀏覽器中輸入

圖片描述

圖片描述

總結

TcpListener類,簡化了對tcp協議的監聽,透過TcpClient可以得到網路流,然後就可以對網路的輸入和輸出進行操作了,用起來更方便。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3486/viewspace-2800445/,如需轉載,請註明出處,否則將追究法律責任。

相關文章