在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文件中声明网络访问权限。其次,需要确保代码能够正确地处理网络错误和异常。在网络编程中,错误和异常是常见的,需要确保应用程序能够优雅地处理它们。