WCF Одноранговый чат - PullRequest
       38

WCF Одноранговый чат

1 голос
/ 05 октября 2009

Я написал код для программы чата 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.

1 Ответ

1 голос
/ 05 октября 2009

У вас случайно не было обоих экземпляров программы, слушающих одну и ту же конечную точку? Я не уверен, но я подозреваю, что может произойти то, что ваше клиентское приложение сначала регистрирует себя на конечной точке, а затем перехватывает все сообщения, которые приходят на эту конечную точку, прежде чем второе получит их. Я бы предложил попробовать настроить второй экземпляр для запуска на конечной точке с другим Uri. Так, скажем, один подключается к net.p2p: // PeerChatA /, а другой net.p2p: // PeerChatB /.

...