在原來的HTTPServer項目解決方案中添加新的控制檯SocketServer項目chrome
添加新的項目後能夠看到解決方案中有兩個項目編程
創建好項目後咱們能夠進行編程c#
進行編程前咱們須要瞭解c# socket編程以及http的規範瀏覽器
1.socket編程服務器
首先咱們決定使用tcp協議,拿到一張socket的tcp鏈接過程多線程
第一個創建一個c# socket套接字對象:異步
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socket
其中對象構造函數須要傳入三個對象用於創建合適的socket鏈接tcp
AddressFamily.InterNetwork表明使用ipv4協議函數
SocketType.Stream基於流
ProtocolType.Tcp協議爲TCP
創建socket對象後咱們須要綁定ip和端口:
ip使用0.0.0.0做爲監聽端口
port使用7777做爲監聽端口
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 7777);
第三步是註冊監聽端口:
s.Listen(0);
第四步是進入接受狀態:
Socket temp = s.Accept();
此時程序阻塞等待客戶端鏈接
鏈接成功程序才能繼續執行
目前處理好socket的創建與鏈接,咱們測試一下代碼是否能正確鏈接再進行讀寫的操做,經過右側項目設置爲啓動項目
程序運行
咱們看到系統監聽着0.0.0.0:7777
因爲瀏覽器充當客戶端的角色,咱們只須要再瀏覽器中訪問127.0.0.1:7777
 
此時咱們可能看到瀏覽器經過端口16201與服務器鏈接,因爲沒有讀寫請求,因爲瀏覽器會一直停留在鏈接狀態等待超時
肯定程序能正常運行咱們再繼續編碼讀寫部分
一旦鏈接成功後咱們能夠經過鏈接成功的套接字temp這個對象來讀取寫
接收temp.Receive(buf, buf.Length, SocketFlags.None);
發送temp.Send(buf, buf.Length, SocketFlags.None);
其中須要先創建byte[] buf = new byte[1024];一個buf來存儲
而後能夠讀寫操做
讀出來的buf能夠經過Encoding.ASCII.GetString(buf, 0, bytes);轉換成字符串來顯示
咱們先讀取到buf,轉換成string對象顯示到控制檯,再從控制檯讀取一行發送到遠端,最後關閉鏈接,關閉監聽
測試運行
瀏覽器發送http請求數據輸入到服務器
而後咱們寫入一行
回車
瀏覽器顯示hello world
雖然使用並不符合http規範的響應也能夠被部分瀏覽器顯示,但爲了達到更規範的http服務器,咱們須要寫上相應的響應頭
buf = Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\nServer: HTTPServer\r\n\r\n<h1>" + Console.ReadLine().ToString()+"</h1>");
不一樣的相應具備不一樣的響應頭,這裏不仔細研究更多的狀況
最後咱們能夠經過chrome的開發者工具看到相關的相應信息,包括服務器與返回的狀態碼,也能正確讀取具體的內容
經過此次實驗掌握了socket的單線程編程,對於tcp鏈接的幾個步驟也有更深入的理解,對http的規範也有相應的掌握,在多線程與異步的處理上仍有待學習提升