我为一个WCF P2P聊天程序写了一些代码。
<services>
<service name="PeerChat.Form1">
<host>
<baseAddresses>
<add baseAddress="net.p2p://PeerChat/" />
</baseAddresses>
</host>
<endpoint name="PeerChatEndPoint" address="" binding="netPeerTcpBinding" bindingConfiguration="BindingUnsecure"
contract="PeerChat.IChatService" />
</service>
</services>
<bindings>
<netPeerTcpBinding>
<binding name="BindingUnsecure">
<resolver mode="Pnrp" />
<security mode="None" />
</binding>
</netPeerTcpBinding>
</bindings>
<client>
<endpoint
name="PeerChatClientEndPoint"
address="net.p2p://PeerChat/"
binding="netPeerTcpBinding"
bindingConfiguration="BindingUnsecure"
contract="PeerChat.IChatService"
/>
</client>然后我托管服务,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public partial class Form1 : Form, IChatService
{
IChatService channel;
ServiceHost host = null;
ChannelFactory<IChatService> channelFactory = null;
private void StartService()
{
//Instantiate new ServiceHost
host = new ServiceHost(this);
//Open ServiceHost
host.Open();
//Create a ChannelFactory and load the configuration setting
channelFactory = new ChannelFactory<IChatService>("PeerChatClientEndPoint");
channel = channelFactory.CreateChannel();
//Lets others know that someone new has joined
channel.SendMessage("Hello."+ Environment.NewLine);
foreach (var cloud in Cloud.GetAvailableClouds())
{
textBox2.Text += cloud.Name + Environment.NewLine;
}
}
private void StopService()
{
if (host != null)
{
channel.SendMessage("Bye." + Environment.NewLine);
if (host.State != CommunicationState.Closed)
{
channelFactory.Close();
host.Close();
}
}
}问题是我可以向程序的同一实例发送消息,但不能向另一个实例发送消息。Ie实例只接收自己的消息,不接收来自其他实例的消息。不确定是否是正确配置PNRP的问题?我在Windows7上测试过。
发布于 2009-10-05 13:31:02
您不会碰巧有两个程序实例监听相同的端点,对吗?我不确定,但我怀疑可能发生的情况是,您的客户端应用程序首先在端点上注册自己,然后在第二个端点获得消息之前拦截到达该端点的所有消息。我建议尝试将第二个实例配置为在具有不同Uri的端点上启动。假设一个连接到net.p2p://PeerChatA/,另一个连接到net.p2p://PeerChatB/。
https://stackoverflow.com/questions/1520038
复制相似问题