標籤:
一.UDP協議
UDP(User Datagram Protocol)協議就是“使用者資料包通訊協定”,它是一種不需連線的協議,無串連主要是和TCP協議相比較的。我們知道當利用TCP協議傳送資料的時候,首先必須建立串連(也就是所謂的握手)才可以傳輸資料。而當電腦利用UDP協議進行資料轉送的時候,發送方只需要知道對方的IP地址和連接埠號碼就可以發送資料,而並不需要進行串連。
由於UDP協議並不需要進行確定的串連,所以編寫基於UDP協議的應用程式比起編寫基於TCP協議的應用程式要簡單些(程式中可以不需要考慮串連和一些異常的捕獲工作)。但同時也給基於UDP協議編寫的程式帶來了一個致命的缺點,UDP由於不提供可靠資料的傳輸,當電腦之間利用UDP協議傳送資料的時候,發送方只管發送資料,而並不確認資料是否被對方接收。這樣就會導致某些UDP協議資料包在傳送的過程中丟失,尤其網路品質不令人滿意的情況下,遺失資料包的現象會更嚴重。這就是為什麼在網路上傳輸重要資料不採用UDP協議的原因。
可見UDP是一種不連線導向的網路通訊協定,既有其優點,也有其不足,具體如下:
1.基於UDP協議的網路應用程式,實現起來比較簡單,並且基於UDP協議的網路應用程式在運行時,由於受到環境影響較小,所以不容易出錯。
2.UDP協議佔用網路資源較少,資料處理較快,所以在網路中傳送對安全性要求不是十分高資料時,其優點比較明顯。所謂對安全性要求不高的資料,是指那些不重要的資料,或者是即使丟失若干資料,也不影響其整體的資料,如音頻資料等。目前很多流行的網路應用程式都是基於UDP協議的,如OICQ、ICQ等。
3.由於其不是連線導向的網路通訊協定,其缺點也是非常明顯的,有些時候甚至是致命的。因為使用UDP協議來傳送資料,在資料發送後,在發送方並不確認對方是否接收到。這樣就可能導致傳送的資料在網路中丟失,尤其在網路條件並不很好的情況下,遺失資料包的現象就更多。所以傳送重要資料一般不採用UDP協議。
二.C#發送、接收UDP資料包使用的主要類及其用法
用Visual C#實現UDP協議,最為常用,也是最為關鍵的類就是UdpClient,UdpClient位於命名空間System.Net.Sockets中,Visual C#發送、接收UDP資料包都是通過UdpClient類的。
表-1 UdpClient類中常用方法及其說明
方法 |
說明 |
Close |
關閉 UDP 串連 |
Connect |
建立與遠程主機的串連 |
DropMulticastGroup |
退出多路廣播組 |
JoinMulticastGroup |
將 UdpClient 添加到多路廣播組 |
Receive |
返回已由遠程主機發送的 UDP 資料文報 |
Send |
將 UDP 資料文報發送到遠程主機 |
表-2:UdpClient類中常用屬性及其說明
屬性 |
說明 |
Active |
擷取或設定一個值,該值指示是否已建立了與遠程主機的串連 |
Client |
擷取或設定基礎網路通訊端 |
1. C#使用UdpClient類發送UDP資料包
在具體使用中,一般分成二種情況:
(1) 知道遠端電腦IP地址:
Send方法的調用文法如下:
publicint Send ( byte[] dgram , int bytes , IPEndPoint endPoint ) ;
參數說明:
dgram 要發送的 UDP資料文報(以位元組數組表示)。
bytes 資料文報中的位元組數。
endPoint一個 IPEndPoint類型,它表示要將資料文報發送到的主機IP和連接埠。
返回值 已發送的位元組數。
下面使用UdpClient發送UDP資料包的具體的調用例子:
IPAddressHostIP = new IPAddress.Parse ( "192.168.0.188" ) ;IPEndPointhost = new IPEndPoint ( HostIP , 10002 ) ;UdpClient.Send( "發送的位元組" , "發送的位元組長度" , host ) ;
(2) 知道遠端電腦名稱
Send方法的調用文法如下:
publicint Send ( byte[ ] dgram , int bytes , string hostname , int port ) ;
參數說明:
dgram 要發送的 UDP資料文報(以位元組數組表示)。
bytes 資料文報中的位元組數。
hostname要串連到的遠程主機的名稱。
port 要與其通訊的遠程連接埠號碼。
返回值 已發送的位元組數。
2. C#使用UdpClient類接收UDP資料包:
接收UDP資料包使用的是UdpClient中的Receive方法,此方法的調用文法如下:
publicbyte [] Receive ( ref IPEndPoint remoteEP ) ;
參數
remoteEP是一個 IPEndPoint類的執行個體,它表示網路中發送此資料包的節點。
下面使用UdpClient接收UDP資料包的具體的調用例子:
server= new UdpClient ( ) ;receivePoint= new IPEndPoint (new IPAddress(127001), 8080 ) ;byte[]recData = server.Receive ( ref receivePoint ) ;
三.UDP用戶端代碼,用戶端程式主要就是向伺服器端發送資料
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace UDPClient{ class UDPClient { private UdpClient client; private IPEndPoint receivePoint; //發送資料函數 public void start_client() { Console.WriteLine("用戶端啟動"); client = new UdpClient(8080);//用戶端使用8080連接埠發送資料 receivePoint = new IPEndPoint(new IPAddress(127001), 10002); IPAddress HostIP; bool continueLoop = true; while(continueLoop){ System.Text.ASCIIEncoding encode = new System.Text.ASCIIEncoding(); string sendString = Console.ReadLine(); byte[] sendData = encode.GetBytes(sendString); try { HostIP = IPAddress.Parse("127.0.0.1"); IPEndPoint host = new IPEndPoint(HostIP, 10002); //伺服器端通訊端,用戶端發送資料到此通訊端 client.Send(sendData, sendData.Length, host); byte[] recData = client.Receive(ref receivePoint);//用戶端使用8080連接埠,接收伺服器從10002連接埠發送過來的資料 Console.WriteLine(encode.GetString(recData)); continueLoop = false; }catch{ client.Close(); return; } } } } class Program { static void Main(string[] args) { UDPClient udpClient = new UDPClient(); udpClient.start_client(); } }}
四.UDP伺服器端代碼,伺服器端程式主要就是接收用戶端發送的資料
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace UdpServer{ class UdpServer { private UdpClient server; private IPEndPoint receivePoint; private Thread startServer; //接受資料函數start_server public void start_server() { Console.WriteLine("UDPServer啟動。。。"); while (true) { ASCIIEncoding encode = new ASCIIEncoding(); byte[] recData = server.Receive(ref receivePoint);//伺服器端從10002連接埠接收receivePoint發送來的資料包 string Read_str = encode.GetString(recData); Console.WriteLine(Read_str); byte[] sendData = encode.GetBytes("OK"); server.Send(sendData, sendData.Length, receivePoint);//伺服器將資料發送到用戶端的8080連接埠 } } //建立一個線程 public void run() { //利用本地連接埠號碼初始化一個UDP網路服務 server = new UdpClient(10002);//本地連接埠號碼,用戶端將資料發送到伺服器的10002連接埠,伺服器從10002連接埠接收資料 receivePoint = new IPEndPoint(new IPAddress(127001),8080); //用戶端的通訊端 startServer = new Thread(new ThreadStart(start_server)); //啟動線程 startServer.Start(); } } class Program { static void Main(string[] args) { UdpServer udpServer = new UdpServer(); udpServer.run(); } }}
C#UDP編程