1

我为 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();
            }
        }
    }

问题是我可以向程序的同一实例发送消息,但不能向另一个实例发送消息。即一个实例只接收它自己的消息而不是来自其他实例的消息。不确定是否是正确配置 PNRP 的问题?我在 Windows 7 上进行了测试。

4

1 回答 1

1

您不会碰巧让程序的两个实例都在听同一个端点,对吗?我不确定,但我怀疑可能发生的情况是您的客户端应用程序首先在端点上注册自己,然后在第二个可以获取它们之前拦截到达该端点的所有消息。我建议尝试做的是将第二个实例配置为在具有不同 Uri 的端点上启动。所以说一个连接 net.p2p://PeerChatA/ 和另一个 net.p2p://PeerChatB/ 。

于 2009-10-05T13:31:02.250 回答