項目一期已經作完,二期需求還沒定稿,因此最近比較閒。網絡
上一篇寫的是TCP協議,今天寫一下UDP協議。TCP是有鏈接協議,因此發送和接收消息前客戶端和服務端須要創建鏈接;UDP是無鏈接協議,因此發送消息前不須要創建鏈接,只需向指定的網絡端點發送消息便可,無論端點是否存在均可以發送,不管消息是否到達端點都不關心,接收消息前也不須要創建鏈接,只須要在本地綁定的端口上接收就能夠了,UDP沒有明確的客戶端和服務端。socket
程序是基於命令行的,啓動一個實例以後根據界面提示輸入本地端口號、遠程IP、遠程端口號便可,能夠啓動多個實例互相通信。spa
程序啓動以後首先根據輸入的本地端口號綁定本地端口,其次啓動一個線程接收本地端口的數據,而後界面上提示輸入消息,輸入完成則發送到遠程IP和遠程端口號,界面上再次提示輸入消息……pwa
運行效果圖:命令行
圖1. 實例1線程
圖2. 實例2code
關鍵代碼blog
綁定本地端口:ip
1 var localPoint = new IPEndPoint(0, localPort); 2 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 3 socket.Bind(localPoint);
啓動線程執行數據接收:rem
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 try 18 { 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);
本人才疏學淺,歡迎你們批評指正!