Windows Phone 7的UDP通信功能

在Windows Phone 7中,获得了一项新功能——socket支持。原本以为只能通过服务器在其他机器上运行来打开socket,但有一件事让感到惊讶;那就是也可以使用UDP在手机之间发送通信。必须感谢Ricky_T指出了这个特性,并发布了一个代码示例。想亲自尝试一下。所以制作了一个可以在Windows Phone和桌面(Silverlight 4在Out of Browser模式下)上运行的代码示例。很高兴地发现,能够在桌面和手机之间打开点对点通信,而没有任何问题。这种能力为一直在考虑的一些问题提供了多种解决方案,例如自动发现和配置,以便与用户本地网络上托管的服务进行通信。

在这个示例中,桌面和手机版本的大部分代码是相同的;在项目之间共享了一些相同的文件。从那些不共享的文件来看,手机和桌面版本的对应部分仍然相似。代码的核心是一个名为Peer的类。让来看一下该类的一部分主体。

C# // 定义用于通信的端口和多播地址 private string _channelAddress = "224.0.0.1"; private int _channelPort = 3007; // 当消息到达时触发的事件 public event EventHandler MessageReceived; // 通信将发生的UDP通道。 private UdpAnySourceMulticastClient _channel; // 创建通道 public void Initialize() { _channel = new UdpAnySourceMulticastClient(IPAddress.Parse(_channelAddress), _channelPort); } // 打开通道并开始监听 public void Open() { if (_channel == null) Initialize(); ClientState = ClientStatesEnum.Opening; _openResult = _channel.BeginJoinGroup((result) => { _channel.EndJoinGroup(result); ClientState = ClientStatesEnum.Opened; }, null); Receive(); }

接收方法是递归的。在调用接收方法结束时,它会调用自己,以便类可以继续监听传入的请求。

void Receive() { byte[] _receiveBuffer = new byte[1024]; _channel.BeginReceiveFromGroup(_receiveBuffer, 0, _receiveBuffer.Length, (r) => { if (ClientState != ClientStatesEnum.Closing) { try { IPEndPoint source; int size = _channel.EndReceiveFromGroup(r, out source); OnMessageReceived(_receiveBuffer, size, source); } catch (Exception) { } finally { this.Receive(); } } }, null); }

这个类只发送和接收字节数组。目标只是看到代码工作,所以决定暂时忽略其他考虑。也为此代码制作了一个客户端。客户端发送和接收纯文本。在发送一块文本之前,需要将文本转换为字节数组。.NET中的编码类会为处理这个问题。当一条消息进来时,也可以使用方法将字节数组转换回字符串。

void _peer_MessageReceived(object sender, MessageReceivedEventArgs e) { Action a = () => { string message = System.Text.UTF8Encoding.Unicode.GetString(e.Data, 0, e.Size); MessageList.Add(String.Format("{0}:{1}", e.Endpoint.Address.ToString(), message)); OnIncomingMessageReceived(message, e.Endpoint.Address.ToString()); }; if (UIDispatcher == null) a(); else UIDispatcher.BeginInvoke(a); }

当代码在任何组合的多部手机或计算机上运行时,任何一部设备上的消息类型都会出现在所有设备上。太好了!现在开始利用它。

通过这种方式,可以实现在不同设备之间的通信,这对于开发移动应用和桌面应用来说是非常有用的。例如,可以在家庭网络中实现设备之间的自动发现和配置,或者在多个设备之间同步数据。

在实现这个功能时,需要注意一些关键点。首先,需要确保应用程序具有正确的网络权限。在Windows Phone 7中,需要在应用程序的manifest文件中声明网络访问权限。其次,需要确保代码能够正确地处理网络错误和异常。在网络编程中,错误和异常是常见的,需要确保应用程序能够优雅地处理它们。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485