Windows Store apps开发[21]DatagramSocket与UDP

注:本文由BeyondVincent(破船)原创首发

        转载请注明出处:BeyondVincent(破船)@DevDiv.com


本文章主要内容如下

1、DatagramSocket介绍【译自DatagramSocket

2、使用DatagramSocket来发送UDP【译自UDP and Windows 8 apps


1、DatagramSocket介绍

    在Windows 8中,是使用DatagramSocket进行UDP数据包网络通讯的。DatagramSocket可以用于客户端程序,以及监听从服务器程序发来的UDP数据。通过DatagramSocket接收数据,程序必须将一个MessageReceived事件赋予一个event handler,然后调用BindEndpointAsync(或BindServiceNameAsync)方法,将DatagramSocket绑定到一个本地服务名称或者UDP端口上,之后在调用ConnectAsync方法。如果event handler和绑定操作在连接操作之后才处理,那么会发生错误。

下面是接收UDP数据包的典型操作步骤:

A、创建一个DatagramSocket

B、使用Control属性来检索DatagramSocketControl对象,以及设置一些高级的控制。这步骤一般不需要

C、将MessageReceived事件赋予event handler

D、将DatagramSocket绑定到一个本地服务名或UDP端口上

E、调用ConnectAsync方法开启远程连接操作,此方法是用于将要使用DatagramSocket的OutpuStream属性来发送数据时。如果程序想要通过DatagramSocket从远程接收数据,那么不能使用ConnectAsync方法把DataramSocket绑定到指定的远程端口,而要使用BindServiceNameAsync或BindEndpointAsync方法。

注意:

使用DatagramSocket类的一些需求:

A、至少支持的客户端:Windows 8

B、至少支持的服务端:Windows Server 2012

C、名称空间:Windows.Networking.Sockets    Windows::Networking::Sockets[C++]

D、Metadata:    Windows.winmd

E、DLL:            Windows.Networking.dll

F、Capablilities: internetClient privateNetworkClientServer


2、使用DatagramSocket来发送UDP

    我现在使用的Windows 8 程序需要使用UDP通过无线网络来发送一些数据。这通常是使用名称空间System.Net.Sockets下的Socket类进行的。然而,在Windows RT中不支持这样使用,它取代了一些等价类的Socket行为。使用UDP的类是DatagramSocket。在使用DatagramSocket时,代码要相对短和简单,要正常运转的话,稍微有点复杂,因此在这篇文章中我会提供一个工作的例子,让其简单点。

    从概念级来讲,打开UDP连接和发送数据非常简单:

    1、创建本地socket

    2、连接至远程主机

    3、发送数据至远程主机

代码本身很短,因此在这里我进行分解说明。如果你能根据IP地址和端口,猜中具体做什么工作,我奖励你积分哦。


    创建本地socket

    第一步是使用DatagramSocket创建socket:

DatagramSocket udpSocket = new DatagramSocket();
    DatagramSocket的一个优点是我不用指定具体使用的协议类型,因为它只发送UDP数据包。

下面我需要将socket绑定到一个本地端口,这个端口用来指定UDP数据包源于的端口。在这里,我使用端口号为5556:

await udpSocket.BindServiceNameAsync(“5556”);

上面的语句是简单的传了一个包含端口号的字符串。在这里使用await关键字是因为BindServiceNameAsync()是异步方法。关于await关键和Windows RT Tasks,请在本文最后给出的相关链接中查看。


连接至远程主机

第二步是打开一个至远程主机的连接。在这里的示例中,我想要连接到IP地址为192.168.1.1,由于DatagramSocket.ConnectAsync()方法使用一个HostName类的实例作为参数。因此首先我需要创建一个新的HostName来代表远程主机:

HostName remoteHost = new HostName(“192.168.1.1”);
    同样,这里传递的参数也是一个包含IP地址的字符串,当然也可以是我想要连接的某个URL。然后我就可以调用ConnectAsync方法来打开连接(传递刚刚创建的HostName和端口):

await udpSocket.ConnectAsync(remoteHost, “5556”);


发送数据至远程主机

一旦连接建立,就可以发送数据了。DatagramSocket类并不包含任意的发送数据包方法,而需要使用DataWriter类。发送数据的第一步是创建一个新的DataWriter,并将DatagramSocket(udpSocket)的属性OutputStream传递进去:

DataWriter udpWriter = new DataWriter(udpSocket.OutputStream);

现在,我想要发送字符串“juncti juvant”至远程主机。DataWriter实际上是没有方法来处理这个操作的;发送数据需要分为两部分处理。首先,需要将数据写入OutputStream中:

udpWriter.WriteString(“juncti juvant”);
查看DataWriter类的文档可以知道能写入什么类型的数据。

数据现在还没有发送到远程主机;现在,需要使用DataWriter来发送UDP包,调用DataWriter.StoreAsync()方法:

await udpWriter.StoreAsync();
这样,UDP包中的“juncti juvant”就在发送至主机的路上了!

下面是发送UDP包的汇总代码:

// Create a new socket and bind it to a local port
DatagramSocket udpSocket = new DatagramSocket();
await udpSocket.BindServiceNameAsync(“5556”);

// Open a connection to a remote host
HostName remoteHost = new HostName(“192.168.1.1”);
await udpSocket.ConnectAsync(remoteHost, “5556”);

// Send a data string to the remote host in a UDP packet
DataWriter udpWriter = new DataWriter(udpSocket.OutputStream);
udpWriter.WriteString(“juncti juvant”);
await udpWriter.StoreAsync();


资源:

DatagramSocket:http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.datagramsocket.aspx
HostName: http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.hostname.aspx
DataWriter: http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.datawriter.aspx
await keyword and Tasks: http://msdn.microsoft.com/en-us/library/hh156528.aspx

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值