UDP和TCP是網絡通訊常用的兩個傳輸協定,C#一般可以通過Socket來實作UDP和TCP通訊,由于.NET架構通過UdpClient、TcpListener 、TcpClient這幾個類對Socket進行了封裝,使其使用更加友善, 本文就通過這幾個封裝過的類講解一下相關應用。
UDP和TCP是網絡通訊常用的兩個傳輸協定,C#一般可以通過Socket來實作UDP和TCP通訊,由于.NET架構通過UdpClient、TcpListener 、TcpClient這幾個類對Socket進行了封裝,使其使用更加友善, 本文就通過這幾個封裝過的類講解一下相關應用。
二、UDP基本應用
與TCP通信不同,UDP通信是不分服務端和用戶端的,通信雙方是對等的。為了描述友善,我們把通信雙方稱為發送方和接收方。
發送方:
首先建立一個UDP對象:
發送資料:
以上就完成了一個發送任務,一個較完整的發送代碼如下:

View Code
接收端:
接收資料:
注意兩點:
1、remotePoint是獲得發送方的IP資訊,定義時可以輸入任何合法的IP和端口資訊;
2、Receive方法是阻塞方法,是以需要在新的線程内運作,程式會一直等待接收資料,當接收到一包資料時程式就傳回,要持續接收資料需要重複調用Receive方法。
一個較完整的接收端代碼如下:

當發送端發送一包資料時,不管對方是否接收都是發送成功的,UDP協定本身并不會對發送的可靠性進行驗證。(這裡的可靠性是指是否接收到,如果對方接收到資料包,其内容還是可靠的,這個在鍊路層進行了保證。)同時,由于網絡延時等因素,先發送的包并不能确定先被接收到,是以由于這兩個原因,UDP通信存在丢包和亂序的情況。
某些業務場景下,比如實時狀态監控,可能對丢包和亂序情況并不敏感, 可以不用處理,但大部分情況下還是介意丢包的,簡單的處理辦法就是把包的頭部固定長度的空間拿出來存放核對資訊,比如包編号,如果有缺失,可以要求發送方重發,也可以進行排序。
四、将資料接收包裝為事件
我們對UdpClent又進行一次封裝,啟用一個線程進行接收資料,将接收到的資料包通過事件釋出出來,這樣使用起來就更友善了。
具體使用辦法:
限于篇幅,我們隻封裝了資料接收,時間使用時需要把發送功能也封裝進去,使這個類同時具備發送和接收功能,發送功能的封裝比較簡單就不貼代碼了。
C#網絡程式設計入門系列包括三篇文章:
(一)C#網絡程式設計入門之UDP
(二)C#網絡程式設計入門之TCP
(三)C#網絡程式設計入門之HTTP
簽名區:
如果您覺得這篇部落格對您有幫助或啟發,請點選右側【推薦】支援,謝謝!