- ASP.NET本質(zhì)論
- 郝冠軍
- 555字
- 2018-12-31 19:25:13
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相同。
推薦閱讀
- Java程序設(shè)計(jì)(慕課版)
- NLTK基礎(chǔ)教程:用NLTK和Python庫構(gòu)建機(jī)器學(xué)習(xí)應(yīng)用
- C# 從入門到項(xiàng)目實(shí)踐(超值版)
- Mastering Kotlin
- Koa開發(fā):入門、進(jìn)階與實(shí)戰(zhàn)
- PHP+MySQL網(wǎng)站開發(fā)項(xiàng)目式教程
- 人人都懂設(shè)計(jì)模式:從生活中領(lǐng)悟設(shè)計(jì)模式(Python實(shí)現(xiàn))
- Java程序設(shè)計(jì):原理與范例
- 深入理解Android:Wi-Fi、NFC和GPS卷
- 編程菜鳥學(xué)Python數(shù)據(jù)分析
- Babylon.js Essentials
- 軟件測試綜合技術(shù)
- scikit-learn Cookbook(Second Edition)
- IPython Interactive Computing and Visualization Cookbook
- Scratch編程從入門到精通