[深刻浅出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

相关文章
相关标签/搜索