C#創建一個小型Web Server(Socket實現)。本站提示廣大學習愛好者:(C#創建一個小型Web Server(Socket實現))文章只能為提供參考,不一定能成為您想要的結果。以下是C#創建一個小型Web Server(Socket實現)正文
要實現了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);
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。