Windows Phone 7上的对等通信(译文)
By S.F.
本文链接 https://www.kyfws.com/news/peer-communication-on-windows-phone/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 3 分钟阅读 - 1161 个词 阅读量 0Windows Phone 7上的对等通信(译文)
原文地址:https://www.codeproject.com/Articles/217754/Peer-Communication-on-Windows-Phone
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
Windows Phone 7上的对等通信
反对发布前信息
Windows Phone 7的新功能之一是套接字支持.虽然我希望能够在运行有服务器的其他计算机上打开套接字,但有一件事情令我感到惊讶.您还可以使用UDP在电话之间发送通信.我必须感谢[Ricky_T](http://blogs.msdn.com/b/rickyt/archive/2011/06/15/windows-phone-peer-to-peer-multiplayer-game-using- sockets-in-xna.aspx),用于指出此功能的存在并发布代码示例.我想亲自尝试一下.因此,我制作了可以在Windows Phone和台式机上运行的代码示例版本(“浏览器外"模式下的Silverlight 4).我也很高兴能够打开台式机和电话之间的对等通信而不会出现问题.此功能为我一直在考虑的其他问题提供了许多解决方案,例如用于与用户本地网络上托管的服务进行通信的自动发现和配置. 此示例的桌面版和电话版中使用的大多数代码是相同的;我在项目之间共享了一些相同的文件.从未共享的文件来看,手机和台式机版本中的对应文件仍然相似.该代码的核心是在一个名为” Peer"的类中.让我们看一下该类主体的一部分.
//Define the port and multicast address to be used for communication
private string _channelAddress = "224.0.0.1";
private int _channelPort = 3007;
//The event to be raised when a message comes in
public event EventHandler<MessageReceivedEventArgs> MessageReceived;
//the UDP channel over which communication will occur.
private UdpAnySourceMulticastClient _channel;
//Create the channel
public void Initialize()
{
_channel = new UdpAnySourceMulticastClient(
IPAddress.Parse(_channelAddress), _channelPort);
}
//Open the channel and start listening
public void Open()
{
if (_channel == null)
Initialize();
ClientState = ClientStatesEnum.Opening;
_openResult = _channel.BeginJoinGroup((result) =>
{
_channel.EndJoinGroup(result);
ClientState = ClientStatesEnum.Opened;
}, null);
Receive();
}
//The receive method is recursive. At the end of a call to receive, it calls itself
//so that the class can continue listening for incoming requests.
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);
}
public void Send(byte[] data)
{
if(ClientState==ClientStatesEnum.Opened)
{
_channel.BeginSendToGroup(data, 0, data.Length, (r) =>
_channel.EndSendToGroup(r),null);
}
}
此类仅发送和接收字节数组.我在这里的唯一目标是查看代码的工作原理,因此我决定暂时忽略其他注意事项.我也让客户端也使用此代码.客户端发送和接收纯文本.在发送文本块之前,有必要将文本转换为字节数组. .NET中的编码类将为我解决这个问题.收到消息时,我还可以使用编码器将字节数组转换回"字符串". 对于此程序,我将传入消息以及消息的来源IP地址添加到列表中:
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);
}
public void SendMessage(string message)
{
byte[] encodedMessage= UTF8Encoding.Unicode.GetBytes(message);
_peer.Send(encodedMessage);
}
当代码在多部电话或计算机的任何组合上运行时,所有设备上都会出现任何一种设备上的消息类型.真好!现在开始使用它.
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C# Mobile Dev Intermediate Windows-Phone-7 新闻 翻译