2009-10-05 6 views
1

WCF P2P 채팅 프로그램 용 코드를 작성했습니다. 다음과 같이WCF 피어 투 피어 채팅

<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

동일한 엔드 포인트를 수신하는 두 프로그램 인스턴스가 모두 발생하지 않았습니까? 확신 할 수는 없지만 클라이언트 응용 프로그램이 먼저 엔드 포인트에 등록하고 두 번째 엔드 포인트가 도달하기 전에 해당 엔드 포인트로 오는 모든 메시지를 가로 채고 있다는 사실이 의심 스럽습니다. 두 번째 인스턴스가 다른 Uri로 끝점에서 시작되도록 구성하는 것이 좋습니다. 하나는 net.p2p : // PeerChatA /와 다른 하나는 net.p2p : // PeerChatB /에 연결한다고 가정 해보십시오.

+0

그러나 같은 메쉬 주소에서 수신 대기하는 전체 지점이 메시지를 해당 메쉬로 보내야한다고 생각 했습니까? – Ries

+0

사실입니다.하지만 두 프로그램이 서로 다른 두 위치에서 실행되고 있다고 가정합니다. 따라서 컴퓨터 A에서 해당 주소를 수신하고 컴퓨터 B에서 다른 주소를 수신하고 있습니다. WCF에서 두 가지 응용 프로그램이 동일한 컴퓨터의 같은 끝점에서 보내고받는 중입니다. WCF 시스템이 해당 상황에서 해당 테스트 사례에 문제가있는 것으로 의심됩니다 - 따라서 제안. – Streklin

+0

그렇다면 두 인스턴스가 모두 고유 한 메시지를받는 이유는 무엇입니까? – Ries

관련 문제