[深入浅出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, "");
// 创建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"), "");
// 发送消息
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("");
// 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
[深入浅出WP8.1(Runtime)]Socket编程之UDP协议的更多相关文章
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- python六十八课——网络编程之UDP协议
1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...
- Linux系统编程(37)—— socket编程之UDP服务器与客户端
典型的UDP客户端/服务器通讯过程: 编写UDP Client程序的步骤 1.初始化sockaddr_in结构的变量,并赋值.这里使用"8888"作为连接的服务程序的端口,从命令行 ...
- 【Linux】Linux C socket 编程之UDP
发送方: /* * File: main.c * Author: tianshuai * * Created on 2011年11月29日, 下午10:34 * * 主要实现:发送20个文本消息,然后 ...
- C#编程 socket编程之udp服务器端和客户端
基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) 使用Udp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) ...
- Linux系统编程(36)—— socket编程之UDP详解
UDP 是User DatagramProtocol的简称,中文名是用户数据报协议.UDP协议不面向连接,也不保证传输的可靠性,例如: 1.发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协 ...
- java 25 - 4 网络编程之 UDP协议传输的代码优化
UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...
- java 25 - 4 网络编程之 UDP协议传输思路
UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...
- 网络编程之UDP协议
UDP协议 UDP(User Datagram Protocol)也就是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范. 提 ...
随机推荐
- Android系统中默认值的意义列表
转自:http://blog.csdn.net/yabg_zhi_xiang/article/details/51727844 在SettingsProvider中设置系统中默认值,我们可以在fram ...
- [LeetCode] Binary Tree Zigzag Level Order Traversal
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- [Mobile] 手机浏览器输入框-数字输入框
手机浏览器的输入框,一直都是以web的方式进行开发的,没有关注到用户体验,领导提出了输入框要弹出数字输入框,想来应该有这种技术能实现. 搜索之后发现可以使用type="number&qu ...
- 计算第K个素数
暂时没有时间整理,先放在这里: http://www.quora.com/Prime-Numbers/What-are-good-ways-to-find-nth-prime-number-in-th ...
- Get open Popups
public IEnumerable<Popup> GetOpenPopups() { return PresentationSource.CurrentSources.OfType< ...
- objective-c 遍历文件夹查看文件
#import <Foundation/Foundation.h>int main (int argc, const char * argv[]){ @autoreleasepool ...
- Java学习随笔3:遍历文件夹及文件的读取和写入
import java.io.File; /** * 遍历文件夹 */ public class ScannerFile { public static void main(String[] args ...
- Liferay 6.2 改造系列之二十二:如何发布WAR包
1.修改web资源并发布 如果修改了默认主题信息,需执行portal-web中的build-themes任务: 执行portal-web中的deploy任务: 2.修改portal-impl中的jav ...
- H5移动前端性能优化
在移动端,因手机的配置和3/4G网络的原因,从两个方面解决性能优化问题,1.加载不超过3秒,用loading或者资源不要超过1M.2.渲染速度. 基于以上两个方面,所有影响首屏加载和渲染的代码应在处理 ...
- Python与Hack
1.Python的函数:关键字def()表示函数开始,可以在括号内填写任何变量,然后这些变量会被以引用的方式传递给函数,也就是说,函数内对这些变量的任何改变都会影响它们在主调函数中的值: 2.迭代:用 ...