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