C#Socket通訊基礎(非同步Socket通訊UDP)
阿新 • • 發佈:2018-11-07
一、通訊原理參考https://blog.csdn.net/xiaochenXIHUA/article/details/83446031。
非同步通訊解決同步通訊的缺點可以雙向傳送和接收資訊;非同步通訊思路是引入多執行緒機制,在一個程序中使用兩個執行緒,分別處理接收執行緒與傳送執行緒,這種機制稱為非同步Socket。
二、編寫非同步UDP通訊方法
<1>資訊傳送接收程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Test_AsynCommunication { class UDPCommunication { bool sendingFlag = true; bool receiveingFlag = true; IPEndPoint iep = null; IPEndPoint iep_Receive = null; Socket socketClient = null; Socket socketServer = null; byte[] byteSendingArray = null; byte[] byteReceiveArray = null; static void Main(string[] args) { UDPCommunication obj = new UDPCommunication(); Console.WriteLine("---非同步通訊,A---"); obj.OpenSendAndReceiveThread(); } /// <summary> /// 分別開啟“接收”與“傳送”執行緒 /// </summary> private void OpenSendAndReceiveThread() { Thread thSending = new Thread(SendingData); Thread thReveive = new Thread(ReceiveData); thSending.Start(); thReveive.Start(); } /// <summary> /// 傳送執行緒的方法 /// </summary> private void SendingData() { Thread.Sleep(500);//休眠0.5秒 if (sendingFlag) { byteSendingArray = new byte[100]; //定義網路地址 iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1002); socketClient = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); sendingFlag = false; } //傳送資料 Console.WriteLine("請輸入傳送的資料:"); EndPoint ep = (EndPoint)iep; while (true) { string strMsg = Console.ReadLine(); //位元組轉換 byteSendingArray = Encoding.Default.GetBytes(strMsg); socketClient.SendTo(byteSendingArray,ep); if (strMsg=="exit") { break; } } socketClient.Shutdown(SocketShutdown.Both); socketClient.Close(); } /// <summary> /// 接收執行緒的方法 /// </summary> private void ReceiveData() { if (receiveingFlag) { byteReceiveArray = new byte[100]; iep_Receive = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1001); socketServer = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); socketServer.Bind(iep_Receive); receiveingFlag = false; } //接受收據 EndPoint ep = (EndPoint)iep_Receive; while(true) { int intReceiveLenght = socketServer.ReceiveFrom(byteReceiveArray,ref ep); string strReceiveStr = Encoding.Default.GetString(byteReceiveArray,0,intReceiveLenght); Console.WriteLine(strReceiveStr); } } }//class_end }
<2>資訊傳送接收程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Test_AsynCommunicationB { class UDPCommunication { bool sendingFlag = true; bool receiveingFlag = true; IPEndPoint iep = null; IPEndPoint iep_Receive = null; Socket socketClient = null; Socket socketServer = null; byte[] byteSendingArray = null; byte[] byteReceiveArray = null; static void Main(string[] args) { UDPCommunication obj = new UDPCommunication(); Console.WriteLine("---非同步通訊,B---"); obj.OpenSendAndReceiveThread(); } /// <summary> /// 分別開啟“接收”與“傳送”執行緒 /// </summary> private void OpenSendAndReceiveThread() { Thread thSending = new Thread(SendingData); Thread thReveive = new Thread(ReceiveData); thSending.Start(); thReveive.Start(); } /// <summary> /// 傳送執行緒的方法 /// </summary> private void SendingData() { Thread.Sleep(500);//休眠0.5秒 if (sendingFlag) { byteSendingArray = new byte[100]; //定義網路地址 iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1001); socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sendingFlag = false; } //傳送資料 Console.WriteLine("請輸入傳送的資料:"); EndPoint ep = (EndPoint)iep; while (true) { string strMsg = Console.ReadLine(); //位元組轉換 byteSendingArray = Encoding.Default.GetBytes(strMsg); socketClient.SendTo(byteSendingArray, ep); if (strMsg == "exit") { break; } } socketClient.Shutdown(SocketShutdown.Both); socketClient.Close(); } /// <summary> /// 接收執行緒的方法 /// </summary> private void ReceiveData() { if (receiveingFlag) { byteReceiveArray = new byte[100]; iep_Receive = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1002); socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socketServer.Bind(iep_Receive); receiveingFlag = false; } //接受收據 EndPoint ep = (EndPoint)iep_Receive; while (true) { int intReceiveLenght = socketServer.ReceiveFrom(byteReceiveArray, ref ep); string strReceiveStr = Encoding.Default.GetString(byteReceiveArray, 0, intReceiveLenght); Console.WriteLine(strReceiveStr); } } }//class_end }
三、執行測試
注:本內容來自《Unity3D/2D遊戲開發從0到1》28章