[深入浅出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协议的通信。

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类去实现的,实现的步骤如下所示:

    (1)注册DatagramSocket对象的MessageReceived事件接收消息(注意和TCP的ConnectionReceived事件的区别);

    (2)使用BindServiceNameAsync方法建立起本地服务器的监听;

    (3)使用GetOutputStreamAsync方法传入服务器地址和端口号,获取IOutputStream对象,从而创建DataWriter对象向客户端发送消息。

    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

posted on 2014-10-11 11:14  linzheng  阅读(3555)  评论(5编辑  收藏  举报

导航