閑來無事,寫個基於UDP協議的Socket通訊Demo


  項目一期已經做完,二期需求還沒定稿,所以最近比較閑。

  上一篇寫的是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             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);

  本人才疏學淺,歡迎大家批評指正!

 

源代碼下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM