【问题标题】:WCF Peer to peer chatWCF 点对点聊天
【发布时间】:2009-10-05 13:21:31
【问题描述】:

我为 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 上测试过。

【问题讨论】:

    标签: wcf p2p pnrp


    【解决方案1】:

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

    【讨论】:

    • 但我认为监听同一个网格地址的全部意义在于将消息发送到该网格?
    • 这是真的,但是假设这两个程序在两个不同的地方运行——所以一个在机器 A 上监听那个地址,另一个在机器 B 上监听。我没有看到任何东西WCF 定义了当两个应用程序在同一台机器上的相同端点上发送和接收时的行为,并且 怀疑 WCF 系统可能在您的情况下遇到该测试用例的问题 - 因此建议。
    • 但是为什么两个实例都会收到自己的消息呢?
    • 可能是先到先得的情况?我对 WCF 中的消息传递系统了解得不够多,无法解释这一点——我只能建议 WCF 的设计似乎并没有期望人们会做你正在做的事情——因此行为可能是未定义的。如果我的建议在您的本地计算机上有效,我建议发布一个问题,即在具有相同程序的同一台计算机上使用相同端点的行为的定义 - 我相信有人有更深入的知识如果事实证明是这样的话,可以解释一下。
    猜你喜欢
    • 2012-01-22
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多