好不容易把socket通訊搞懂一點,比較喜歡作筆記,嘿嘿~html
socket通訊是C#中很是基礎的一個知識點,我這裏用到的是基於Tcp協議的socket通訊。Tcp會有三次握手鍊接通訊.數組
1、 建立服務端socket的步驟:網絡
1.首先須要引用socket通訊中所用到的名稱空間;socket
using System.Net; using System.Threading; using System.Net.Sockets;
這三個名稱空間是爲socket通訊打基礎,沒有這三個名稱空間沒法實現socket通訊.tcp
2.接下來就是要建立一個socket的對象了,建立socket對象是爲了方便客戶端與服務端之間的通訊,若是你還不明白,就請往下繼續看;post
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
在這裏面有幾個知識點我要補充一下:學習
socket類中的參數我作簡要闡述,AddressFamily.InterNetwork簡單來講就是使用內網,啥,你不知道內網是什麼東東?至於內網是啥,內網就是不能上互聯網的局域網;SocketType.Stream是流式的套接字類型,這種套接字類型是一種可靠且雙向,基於鏈接的字節流,不重複數據,簡單一點就是支持雙向通訊;ProtocolType.Tcp指的是使用基於tcp協議的通訊協議。url
3.綁定IP地址和端口號;spa
//將字符串類型的IP地址轉換爲IPAddress類型 IPAddress ip = IPAddress.Parse("173.168.5.15"); //標識網絡地址 EndPoint point = new IPEndPoint(ip,port); serverSocket.Bind(point);
若是你想實現socket通訊就必須綁定IP地址和端口號,IP地址是計算機的通訊地址,端口號指向計算機中某個軟件或者說是應用程序;線程
4.監聽客戶端的鏈接;
serverSocket.Listen(10);
參數指的是監聽客戶端的最大數量。
5.爲鏈接到的客戶端新建一個socket;
Socket ListenClientSocket= serverSocket.Accept();
這是規定,若是不新建一個socket沒法通訊。
這一步完成時客戶端給服務端發送消息且客戶端會鏈接到服務端,完成第一次握手。
6.向客戶端發送消息;
ListenClientSocket.Send(data);
此時服務端給客戶端發送消息完成第二次握手。
7.接受客戶端消息;
byte[] data2 = new byte[1024]; int length=ListenClientSocket.Receive(data2); string message2=Encoding.UTF8.GetString(data2,0,length); Console.WriteLine("接收到客戶端傳來的消息:"+message2);
服務端接收到客戶端的消息完成第三次握手。
服務端socket 完整代碼以下:
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.Threading; 8 using System.Net.Sockets; 9 10 namespace serverSocketTest2 11 { 12 class Program 13 { 14 static int port = 3500; 15 static void Main(string[] args) 16 { 17 //建立一個socket的對象 18 Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 19 //將字符串類型的IP地址轉換爲IPAddress類型 20 IPAddress ip = IPAddress.Parse("173.168.5.15"); 21 //標識網絡地址 22 EndPoint point = new IPEndPoint(ip,port); 23 serverSocket.Bind(point); 24 //開始監聽 25 serverSocket.Listen(10); 26 Console.WriteLine("等待客戶端鏈接..."); 27 28 //爲鏈接客戶端須要新建一個線程 29 Socket ListenClientSocket= serverSocket.Accept();//暫停當前線程,等待客戶端鏈接以後再執行以後的語句 30 Console.WriteLine("客戶端鏈接成功! 真是使人振奮!"); 31 //傳送的消息 32 string message = "Hello Client!"; 33 //將字符串類型的數據轉換爲byte類型的數組 34 byte[] data=Encoding.UTF8.GetBytes(message); 35 //發送消息 36 ListenClientSocket.Send(data); 37 38 /////接受客戶端數據 39 byte[] data2 = new byte[1024]; 40 41 int length=ListenClientSocket.Receive(data2); 42 string message2=Encoding.UTF8.GetString(data2,0,length); 43 Console.WriteLine("接收到客戶端傳來的消息:"+message2); 44 45 Console.ReadKey(); 46 } 47 } 48 }
2、 建立客戶端socket的步驟以下:
1.引用進行socket通訊的名稱空間;
using System.Net; using System.Threading; using System.Net.Sockets;
緣由我再也不贅述了,相信聰明的大家都懂.
2.客戶端向服務端發送鏈接的請求,創建客戶端和服務端的鏈接;
clientSocket.Connect(ip,port);
這是第一次握手。本次握手與服務端裏的第一次握手同步執行,其實此次握手也是服務端裏的第一次握手。
3.接收數據;
clientSocket.Receive(data);
在這裏須要將客戶端接收到的數據返回一個長度並存儲到byte數組裏。
4.將字節型數據轉換成字符串型的數據;
string message=Encoding.UTF8.GetString(data,0,length);
5.發送數據
clientSocket.Send(data2);
第二次握手鍊接。本次握手與服務端裏的第二次握手同步執行,其實此次握手也是服務端裏的第二次握手。
客戶端socket 完整代碼以下:
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.Threading; 8 using System.Net.Sockets; 9 10 namespace clientSocketTest2 11 { 12 class Program 13 { 14 static int port = 3500; 15 static void Main(string[] args) 16 { 17 //新建一個socket 18 Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 19 IPAddress ip = IPAddress.Parse("173.168.5.15"); 20 21 //客戶端向服務端發送鏈接的請求,創建客戶端和服務端的鏈接 22 clientSocket.Connect(ip,port); 23 //存儲數據,接收數據 24 byte[] data=new byte[1024]; 25 int length=clientSocket.Receive(data); 26 //轉換爲字符串型的數據 27 string message=Encoding.UTF8.GetString(data,0,length);//0,length 表示的是發送的數據的長度 28 Console.WriteLine("接收到來自服務端的數據:"+message); 29 30 /////// 發送數據 31 string message2 = Console.ReadLine(); 32 byte[] data2=Encoding.UTF8.GetBytes(message2); 33 clientSocket.Send(data2); 34 35 Console.ReadKey(); 36 37 } 38 } 39 }
這是個人理解,若是有不足的地方,請指教,共同窗習!但願共同進步!