[深刻淺出WP8.1(Runtime)]Socket編程之UDP協議

13.3 Socket編程之UDP協議

    UDP協議和TCP協議都是Socket編程的協議,可是與TCP協議不一樣,UDP協議並不提供超時重傳,出錯重傳等功能,也就是說其是不可靠的協議。UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境。既然 UDP 是一種不可靠的網絡協議,那麼還有什麼使用價值或必要呢?其實否則,在有些狀況下UDP協議可能會變得很是有用。由於UDP具備TCP所可望不可即的速度優點。雖然TCP協議中植入了各類安全保障功能,可是在實際執行的過程當中會佔用大量的系統開銷,無疑使速度受到嚴重的影響。反觀UDP因爲排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大下降了執行時間,使速度獲得了保證。那麼在Windows Phone裏面的UDP協議的通信是經過DatagramSocket類來實現消息的發送,接受和監聽等功能的,下面咱們來看一下如何在Windows Phone中實現UDP協議的通訊。html

13.3.1 發送和接收消息

    使用UDP協議進行消息的發送和接收和TCP協議是有區別的,UDP協議並不必定要進行鏈接的操做,它能夠直接經過主機地址進行消息的發送和接收。使用UDP協議進行消息的發送和接收也同樣是要依賴DataWriter類和DataReader類來進行分別進行數據的發送和接收。下面咱們來看一下在Windows Phone中使用UDP協議進行發送和接收消息的兩種方式。編程

    (1)使用主機名和端口號直接發送和接收消息安全

    建立一個DatagramSocket類對象,調用GetOutputStreamAsync方法獲取輸出流IOutputStream對象,再使用IOutputStream對象建立DataWriter對象進行消息的發送。接收消息直接訂閱DatagramSocket對象的MessageReceived事件接收消息,使用DataReader對象獲取消息的內容。示例代碼以下所示:服務器

    // 主機名

    HostName hostName = new HostName("localhost");

    DatagramSocket datagramSocket = new DatagramSocket();

    // 訂閱接收消息的事件

    datagramSocket.MessageReceived += datagramSocket_MessageReceived;

    // 獲取輸出流

    IOutputStream outputStream = await datagramSocket.GetOutputStreamAsync(hostName, "22112");

    // 建立DataWriter對象發送消息

    DataWriter writer = new DataWriter(datagramSocket.OutputStream);

    writer.WriteString("test");

    await writer.StoreAsync();

    // 接收消息的事件處理程序

    async void datagramSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)

    {

        // 獲取DataReader對象,讀取消息內容

        DataReader dataReader = args.GetDataReader();

        uint length = dataReader.UnconsumedBufferLength;

        string content = dataReader.ReadString(length);

    }

 

    (2)先鏈接Socket再發送接收消息微信

    DatagramSocket類也提供了ConnectAsync方法來負責Socket的鏈接,鏈接成功以後就可使用該DatagramSocket對象來進行消息的發送,消息的接收和第一種方式的實現是同樣的。示例代碼以下所示:網絡

    // 建立DatagramSocket

    DatagramSocket datagramSocket = new DatagramSocket();

    datagramSocket.MessageReceived += datagramSocket_MessageReceived;

    // 鏈接服務器

    await datagramSocket.ConnectAsync(new HostName("localhost"), "22112");

    // 發送消息

    DataWriter writer = new DataWriter(datagramSocket.OutputStream);

    writer.WriteString("test");

    await writer.StoreAsync();

 

13.3.2 UDP協議服務器端監聽消息

    UDP協議在實現服務器端監聽消息的功能也是使用DatagramSocket類去實現的,實現的步驟以下所示:async

    (1)註冊DatagramSocket對象的MessageReceived事件接收消息(注意和TCP的ConnectionReceived事件的區別);ui

    (2)使用BindServiceNameAsync方法創建起本地服務器的監聽;spa

    (3)使用GetOutputStreamAsync方法傳入服務器地址和端口號,獲取IOutputStream對象,從而建立DataWriter對象向客戶端發送消息。code

    UDP協議服務器端監聽消息的代碼示例以下所示:

    // 建立DatagramSocket對象,調用BindServiceNameAsync方法綁定服務

    DatagramSocket datagramSocket = new DatagramSocket();

    // 訂閱MessageReceived事件監聽客戶端發送過來的消息

    datagramSocket.MessageReceived += datagramSocket_MessageReceived;

    await datagramSocket.BindServiceNameAsync("22112");

    // MessageReceived事件的處理程序,獲取到客戶端的地址後能夠向客戶端發送消息

    async void datagramSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)

    {

        // 讀取客戶端發送過來的消息

        DataReader dataReader = args.GetDataReader();

        uint length = dataReader.UnconsumedBufferLength;

        string content = dataReader.ReadString(length);

        IOutputStream outputStream = await sender.GetOutputStreamAsync(

                args.RemoteAddress,

                args.RemotePort);

        DataWriter writer = new DataWriter(outputStream);

        writer.WriteString(content + "(服務器發送)" );

        await writer.StoreAsync();

    }

本文來源於《深刻淺出Windows Phone 8.1 應用開發》

WP8.1 Runtime文章列表:http://www.cnblogs.com/linzheng/p/3998037.html

源代碼下載:http://vdisk.weibo.com/s/zt_pyrfNHb99O

歡迎關注個人微博@WP林政   微信公衆號:wp開發(號:wpkaifa)

WP8.1技術交流羣:372552293

相關文章
相關標籤/搜索