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

プログラムの両方のインスタンスが同じエンドポイントをリッスンすることはありませんか? 確かではありませんが、クライアント アプリケーションが最初にエンドポイントに自身を登録し、2 番目のエンドポイントがメッセージを取得する前に、そのエンドポイントに到達するすべてのメッセージをインターセプトしている可能性があると思われます。私がやろうとしているのは、別の Uri を持つエンドポイントで起動するように 2 番目のインスタンスを構成することです。たとえば、一方が net.p2p://PeerChatA/ に接続し、もう一方が net.p2p://PeerChatB/ に接続するとします。

于 2009-10-05T13:31:02.250 に答える