zoukankan      html  css  js  c++  java
  • [深入浅出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

  • 相关阅读:
    ansible的管理与剧本
    条件随机场入门(二) 条件随机场的模型表示
    条件随机场入门(一) 概率无向图模型
    隐马尔科夫模型
    高斯混合模型 GMM
    K-Means 算法
    EM 算法
    Sequential Minimal Optimization (SMO) 算法
    LinkedIn文本分析平台:主题挖掘的四大技术步骤
    SVM 核方法
  • 原文地址:https://www.cnblogs.com/linzheng/p/4018601.html
Copyright © 2011-2022 走看看