2016-10-23 2 views
0

私はNetMQ(3.3.3.4)で手を加え、パブサブパターンを作成しています。NetMQ pub-subパターンがReceiveReadyで動作するようにすることができません

1つのポート(9000)のすべての受信データをリッスンし、別のポート(9001)のすべてのクライアント/サブスクライバにデータを転送する必要があります。

クライアントはその後、9000でデータを送信し、私は以下のコードのようなものを作成したドキュメントに続き9001

に(誰で)送信されたすべてのメッセージを受け取り、私はそれが仕事を得ることができないだろう。主に、私は信じています。ReceiveReadyは決して呼ばれません!私はそれが動作するはずと信じてどのように

  • client.Publishに表示されるはずのデータが渡されていた場合、他のソケット
  • に沿ってデータのブロックを解除して渡すことhost.SubscriberSocket_ReceiveReadyの最初の行を起こす必要がありますクライアントで無限のランニングTask

結果:

  • のブレークポイントは// This line is never reachedに到達しません。
  • 例外はありません。
  • それは= 9000をパブリッシュおよびサブスクライブして9001 =ホスト上のポートの切り替えは
  • Windowsファイアウォールは、私が入れている場合、それは違いはありませんオフになっているので、任意の
  • がブロックされてはならない効果がありませんPublisherSocketコンストラクタに対処する、または私は間違って何をやっているクライアントにおけるホストで_publisherSocket.Bind(address)または_publisherSocket.Connect(address)

を使用している場合は?

ホスト

public class MyNetMQHost { 

    private NetMQSocket _publishSocket; 
    private NetMQSocket _subscribeSocket; 
    private NetMQPoller _poller; 

    public MyNetMQHost(string publishAddress = "@tcp://localhost:9001", string subscribeAddress = "@tcp://localhost:9000") { 
     Task.Factory.StartNew(() => { 
      using (_publishSocket = new PublisherSocket(publishAddress)) 
      using (_subscribeSocket = new SubscriberSocket(subscribeAddress)) 
      using (_poller = new NetMQPoller { _publishSocket, _subscribeSocket }) { 
       _subscriberSocket.ReceiveReady += SubscriberSocket_ReceiveReady; 
       _poller.Run(); 
      } 
     }); 
    } 

    private void SubscriberSocket_ReceiveReady(object sender, NetMQSocketEventArgs e) { 
     var data = e.Socket.ReceiveMultipartBytes(); // This line is never reached 
     _publishSocket.SendMultipartBytes(data); 
    } 
} 

クライアント

public class MyNetMQClient { 

    private readonly NetMQSocket _publishSocket; 
    private readonly NetMQSocket _subscribeSocket; 

    public MyNetMQClient(string publishAddress = ">tcp://localhost:9000", string subscribeAddress = ">tcp://localhost:9001") { 
     _publishSocket = new PublisherSocket(publishAddress); 
     _subscribeSocket = new SubscriberSocket(subscribeAddress); 

     Task.Factory.StartNew(() => { 
      while (true) { 
       byte[] frameBytes = _subscribeSocket.ReceiveFrameBytes(); 
       int one = 1; // This line is never reached 
      } 
     }); 
    } 

    public void Publish(byte[] data) { 
     _publishSocket.SendFrame(data); 
    } 
} 

テスター

public class Tester { 
    public void MyTester() { 
     MyNetMQHost host = new MyNetMQHost(); 
     MyNetMQClient client = new MyNetMQClient(); 

     client.Publish(Encoding.Unicode.GetBytes("Hello world!"); 
    } 
} 

答えて

2

あなたのブローカーとクライアントの両方がsuscrを呼び出すことはありません私はあること。 ブローカでは、すべてをサブスクライブするsuscriber.Subscribe( "")を呼び出します。あなたのクライアントはあなたが望むものを購読します。

ブローカーでは、実際にXSubscriberとXPublisherを使用して周りを動かす必要があります。そうすれば、すべて購読する必要はありません。そのためにProxyクラスを使用することができます。

+0

XSub/XPubについてのドキュメントを読んだ後で、試行錯誤してもうまくいくと思います!ありがとう:) – GTHvidsten

関連する問題