C#UDP編程

來源:互聯網
上載者:User

標籤:

一.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編程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.