項目一期已經做完,二期需求還沒定稿,所以最近比較閑。
上一篇寫的是TCP協議,今天寫一下UDP協議。TCP是有連接協議,所以發送和接收消息前客戶端和服務端需要建立連接;UDP是無連接協議,所以發送消息前不需要建立連接,只需向指定的網絡端點發送消息即可,不管端點是否存在都可以發送,無論消息是否到達端點都不關心,接收消息前也不需要建立連接,只需要在本地綁定的端口上接收就可以了,UDP沒有明確的客戶端和服務端。
程序是基于命令行的,啟動一個實例之后根據界面提示輸入本地端口號、遠程ip、遠程端口號即可,可以啟動多個實例互相通訊。
程序啟動之后首先根據輸入的本地端口號綁定本地端口,其次啟動一個線程接收本地端口的數據,然后界面上提示輸入消息,輸入完成則發送到遠程IP和遠程端口號,界面上再次提示輸入消息……
運行效果圖:

圖1. 實例1

圖2. 實例2
關鍵代碼
綁定本地端口:
1 var localPoint = new IPEndPoint(0, localPort);2 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, PRotocolType.Udp);3 socket.Bind(localPoint);
啟動線程執行數據接收:
1 // 啟動新線程負責接收數據2 ThreadPool.QueueUserWorkItem(OnReceive, socket);3 Show("準備就緒");數據接收細節:
1 /// <summary> 2 /// 接收數據 3 /// </summary> 4 /// <param name="obj"></param> 5 private static void OnReceive(object obj) 6 { 7 try 8 { 9 var socket = obj as Socket;10 if (socket == null)11 {12 return;13 }14 15 while (true)16 {17 try18 {19 var receiveBuffer = new byte[1024];20 // 接收數據21 EndPoint remotePoint = new IPEndPoint(IPAddress.Any, 0);22 var receiveLength = socket.ReceiveFrom(receiveBuffer, ref remotePoint);23 ...24 }25 catch (ThreadAbortException)26 {27 throw;28 }29 catch (SocketException exception)30 {31 ...32 }33 catch (Exception exception)34 {35 ...36 }37 }38 }39 catch (ThreadAbortException)40 {41 ...42 }43 catch (Exception exception)44 {45 ...46 }47 }循環執行數據發送:
1 do 2 { 3 try 4 { 5 Show("請輸入消息:", false); 6 var msg = Read(); 7 ... 8 // 發送數據 9 EndPoint sendPoint = new IPEndPoint(address, remotePort);10 var sendLength = socket.SendTo(sendBuffer, sendPoint);11 ...12 }13 catch (SocketException exception)14 {15 ...16 }17 catch (Exception exception)18 {19 ...20 }21 } while (true);本人才疏學淺,歡迎大家批評指正!
源代碼下載
新聞熱點
疑難解答