Wcf 点对点聊天
我为WCF P2P聊天程序编写了一些代码Wcf 点对点聊天,wcf,p2p,pnrp,Wcf,P2p,Pnrp,我为WCF P2P聊天程序编写了一些代码 <services> <service name="PeerChat.Form1"> <host> <baseAddresses> <add baseAddress="net.p2p://PeerChat/" /> </baseAddresses> </host> <endpoint name="P
<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();
}
}
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
公共部分类表单1:表单,IChatService
{
IChatService频道;
ServiceHost主机=null;
ChannelFactory ChannelFactory=null;
私有void StartService()
{
//实例化新的ServiceHost
主机=新服务主机(此);
//开放服务主机
host.Open();
//创建ChannelFactory并加载配置设置
channelFactory=新的channelFactory(“PeerChatClientEndPoint”);
channel=channelFactory.CreateChannel();
//让其他人知道有新成员加入
channel.SendMessage(“Hello.+Environment.NewLine”);
foreach(云中的var cloud.GetAvailableClouds())
{
textBox2.Text+=cloud.Name+Environment.NewLine;
}
}
私有void StopService()
{
if(主机!=null)
{
channel.SendMessage(“再见”。+Environment.NewLine);
if(host.State!=CommunicationState.Closed)
{
channelFactory.Close();
host.Close();
}
}
}
问题是我可以将消息发送到程序的同一个实例,但不能发送到另一个实例。即,一个实例只接收自己的消息,而不接收来自其他实例的消息。不确定这是否是正确配置PNRP的问题?我在Windows 7上进行了测试。您不会碰巧让程序的两个实例都在侦听ame端点可以吗?我不确定,但我怀疑可能发生的情况是,您的客户端应用程序首先在端点上注册自己,然后在第二个端点可以获取消息之前拦截到达该端点的所有消息。我建议尝试将第二个实例配置为在端点w上启动使用不同的Uri。假设一个连接在net.p2p://PeerChatA/上,另一个连接在net.p2p://PeerChatB/上,您不会碰巧让程序的两个实例都在侦听同一个端点,是吗?我不确定,但我怀疑可能发生的情况是,您的客户端应用程序首先在端点上注册自己,然后在端点上注册r在第二个端点可以获取消息之前,先选择到达该端点的所有消息。我建议尝试将第二个实例配置为在具有不同Uri的端点上启动。因此,假设一个实例连接到net.p2p://PeerChatA/和另一个net.p2p://PeerChatB/,但我认为监听同一个mesh广告的全部意义dress是为了将消息发送到该网格?这是真的,但前提是这两个程序在两个不同的地方运行-因此一个在机器A上监听该地址,另一个在机器B上监听。我在WCF上没有看到任何东西定义两个应用在同一网络上的相同端点上发送和接收时的行为机器和我怀疑WCF系统在您的情况下可能在测试用例中遇到问题-因此建议。但是,为什么这两个实例都会收到自己的消息?可能是先到先得的情况?我对WCF中的消息传递系统了解不够,无法解释这一点-我只能建议WCF似乎不是设计的期望人们会做你正在做的事情-因此行为可能是未定义的。如果我的建议在你的本地机器上有效,我建议发布一个关于使用相同程序在同一机器上使用相同端点的行为定义的问题-我相信有人对此有更深入的了解owledge可以解释这种情况。但我认为在同一个网格地址上侦听的全部目的是获取发送到该网格的消息?这是真的,但这假设两个程序在两个不同的位置运行-因此一个在机器A上侦听该地址,另一个在机器B上侦听。我没有听说过“我在WCF上没有看到任何定义两个应用程序在同一台机器上的同一端点上发送和接收时的行为的东西,我怀疑WCF系统在您的情况下可能会遇到该测试用例的问题-因此提出了建议。但是为什么两个实例都会接收自己的消息?可能是先到先的情况?我知道。”我对WCF中的消息传递系统了解不够,无法解释这一点——我所能建议的是,WCF的设计似乎没有期望人们会做你正在做的事情——因此行为可能是未定义的。如果我的建议在你的本地机器上起作用,我建议发布一个关于该行为定义的问题在同一台机器上用同一个程序使用同一个端点的可能性——我相信有人有更深入的知识,能够解释这种情况。