首先我們要了解一下幾點內容:
1、網絡中進程之間如何通信?2、Socket是什么?3、socket的基本操作3.1、socket()函數3.2、bind()函數3.3、listen()、connect()函數3.4、accept()函數3.5、read()、write()函數等3.6、close()函數4、socket中TCP的三次握手建立連接詳解5、socket中TCP的四次握手釋放連接詳解6、一個例子現階段socket通信使用TCP、UDP協議,相對應UDP來說,TCP則是比較安全穩定的協議了。本文只涉及到TCP協議來說socket通信。首先講述TCP/ip的三次握手,在握手基礎上延伸socket通信的基本過程。下面介紹對于應屆生畢業面試來說是非常熟悉的,同時也是最臭名昭著的三次握手:1 客戶端發送syn報文到服務器端,并置發送序號為x。2 服務器端接收到客戶端發送的請求報文,然后向客戶端發送syn報文,并且發送確認序號x+1,并置發送序號為y。3 客戶端受到服務器發送確認報文后,發送確認信號y+1,并置發送序號為z。至此客戶端和服務器端建立連接。在此基礎上,socket連接過程:服務器監聽:服務器端socket并不定位具體的客戶端socket,而是處于等待監聽狀態,實時監控網絡狀態。客戶端請求:客戶端clientSocket發送連接請求,目標是服務器的serverSocket。為此,clientSocket必須知道serverSocket的地址和端口號,進行掃描發出連接請求。連接確認:當服務器socket監聽到或者是受到客戶端socket的連接請求時,服務器就響應客戶端的請求,建議一個新的socket,把服務器socket發送給客戶端,一旦客戶端確認連接,則連接建立。注:在連接確認階段:服務器socket即使在和一個客戶端socket建立連接后,還在處于監聽狀態,仍然可以接收到其他客戶端的連接請求,這也是一對多產生的原因。下圖簡單說明連接過程:下面開始進行代碼分析了:服務器端:TcpServer.cs復制代碼1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 using System.Net;7 using System.Net.Sockets;89 namespace TcpServer10 {11 class PRogram12 {13 static void Main(string[] args)14 {15 //確定端口號16 int port = 6000;1718 //設定連接IP19 string host = "127.0.0.1";2021 //將IP地址字符串轉化為IP地址實例22 IPAddress ip = IPAddress.Parse(host);2324 //將網絡端點表示為 IP 地址和端口號25 IPEndPoint ipe = new IPEndPoint(ip, port);2627 //建立Socket28 //addressFamily 參數指定 Socket 類使用的尋址方案29 //socketType 參數指定 Socket 類的類型30 //protocolType 參數指定 Socket 使用的協議。31 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);3233 //socket與本地終結點建立關聯34 socket.Bind(ipe);35 while (true)36 {37 //開始監聽端口38 socket.Listen(0);3940 Console.WriteLine("服務已開啟,請等待....."+ DateTime.Now.ToString());4142 //為新建的連接建立新的Socket目的為客戶端將要建立連接43 Socket serverSocket = socket.Accept();44 Console.WriteLine("連接已建立......" + DateTime.Now.ToString());4546 string recStr =string.Empty;47 //定義緩沖區用于接收客戶端的數據48 byte[] recbyte = new byte[1024];4950 //返回接收到的字節數51 int bytes = serverSocket.Receive(recbyte, recbyte.Length, 0);5253 //將接收到的字節抓獲年華為string54 //參數一:字節數組 參數二:起始索引 參數三:總長度55 recStr += Encoding.ASCII.GetString(recbyte, 0, bytes);5657 Console.WriteLine("服務器接收到客戶端的信息:" + recStr + " " + DateTime.Now.ToString()+"/n/n");585960 //服務端給客戶端回送消息61 string strSend = "Hello Client!";62 byte[] sendByte = new byte[1024];63 //將發送的字符串轉換為byte[]64 sendByte = Encoding.ASCII.GetBytes(strSend);6566 //服務端發送數據67 serverSocket.Send(sendByte, sendByte.Length, 0);6869 serverSocket.Close();70 }71 }72 }復制代碼客戶端的代碼:復制代碼1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Threading.Tasks;6 using System.Net;7 using System.Net.Sockets;89 namespace TcpClient10 {11 class Program12 {13 static int port = 6000; //監聽端口號14 static string host = "127.0.0.1"; //連接服務端IP15 static IPAddress ip = IPAddress.Parse(host); //將IP地址轉換為IP實例16 static IPEndPoint ipe = new IPEndPoint(ip, port);//將網絡端點表示為 IP 地址和端口號17 static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立客戶端Socket18 19 static void Main(string[] args)20 {2122 clientSocket.Connect(ipe); //客戶端開始連接服務端232425 string sendStr = "Hello,Server!"; //向服務器發送消息26 byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);27 clientSocket.Send(sendBytes);282930 string revStr = ""; //接收來自服務器的消息31 byte[] revBytes = new byte[4096];32 int bytes = clientSocket.Receive(revBytes, revBytes.Length, 0);3334 revStr += Encoding.ASCII.GetString(revBytes, 0, bytes);35 Console.WriteLine("來自服務端的回應:{0}",revStr);3637 clientSocket.Close();38 }39 }40 }新聞熱點
疑難解答