本案例中應用到得一些類和方法先一一列出來
1.IPAddress類用來表示一個IP地址
1.1 IPAddress.Parse("192.168.43.104") 將一串ip地址字符串轉換為IP地址
1.2 IPAddress.Loopback 獲得本機回環地址 即:127.0.0.1
2.IPEndPoint類(端點) 說白了就是ip地址和端口的組合(IP:Point) 他能唯一確定網絡中的一台電腦的某一個應用程序
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080); //創建了一個ip地址為192.168.43.104端口號位8080的網絡端點
2.1.1 Address 獲取或設置終結點的 IP 地址 ex:endPoint.Address //192.168.43.104
2.1.2 AddressFamily 獲得網絡協議 ex:endPoint.AddressFamily //http
2.1.3 AddressPoint 獲得端口號信息 ex:endPoint.Point //8080
3.Socket類 位於System.Net.Socket命名空間中 其封裝了Socket(套接字)的操作。
3.1 Listen 設置基於連接通信的socket進入監聽狀態,並設置等待隊列的長度。 ex:socket.Listen(10) //只允許10個客戶端同時發生請求
3.2 Accept 等待一個新的連接,當新的連接到達的時候,返回一個針對新連接的Socket對象。即每個建立連接的客戶端都對應有一個Socket對象在服務器端,客戶端通過這個對象就可以和服務端進行連接通信了。 ex: Socket client = socket.Accept();
3.3 Receive 通過Socket接受字節數據,保存到一個字節數據中,返回一個int型的數據(實際接收的字節數)。
ex://新建一個緩沖區
byte[] buffer = new byte[2048];
//接受數據
int length = client.Receive(buffer,buffer.Length,SocketFlags.None);
3.4 Send 故名思議 就是發送數據吧 沒錯 send通過Socket發送預先保存在字節數組中的數據。
下面是完整的事例代碼:
//---------------------------------------------------------------------------------------- IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080); //創建socket,使用ipv4地址,傳輸協議為tcp,雙向、可靠、基於連接的字節流 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //將其綁定到一個端點上 socket.Bind(endPoint); //設置連接隊列的長度 socket.Listen(10); Console.WriteLine("開始監聽,端口號:{0}",endPoint.Port); while (true) { //開始監聽。這個方法阻塞線程執行,直到接受到一個客戶端的連接請求 Socket client = socket.Accept(); //輸出客戶端地址 Console.WriteLine("客戶端地址:{0}",client.RemoteEndPoint); //新建一個緩沖區 byte[] buffer = new byte[2048]; //接受數據 int length = client.Receive(buffer,buffer.Length,SocketFlags.None); //將請求的數據轉換為utf-8 //Encoding utf8 = Encoding.UTF8; string requestString = Encoding.UTF8.GetString(buffer, 0, length); //顯示請求的消息 Console.WriteLine(requestString); //回應的狀態行 string statusLine = "HTTP/1.1 200 OK\r\n"; byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine); //准備發送到客戶端的網頁 string responseBody = "<html><head><title>hello world</title></head><body><h2>Hello World</h2></body></html>"; byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody); //回應的頭部 string responseHeader = string.Format("Content-type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", responseBody.Length); byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader); client.Send(statusLineBytes); //發送狀態信息 client.Send(responseHeaderBytes); //發送回應頭 client.Send(new byte[] { 13, 10 }); //頭部與內容的分割行 client.Send(responseBodyBytes); //發送內容部分 client.Close(); //斷開與客戶端的連接 if (Console.KeyAvailable) break; //跳出死循環 } //關閉服務器 socket.Close();
因為http協議是無狀態連接,所以每完成一次或多次請求服務器會自動與客戶端斷開連接,保持服務器的資源
運行結果:
本文源代碼點擊下載 想運行一下結果的童鞋可以參考下哈