0

このプログラムを使用して、PULLソケットをテストしていますROUTER。を作成/バインドROUTERし、ID を持つ PULL ソケットをそれに接続します。次に、ROUTERその ID を使用してクライアント専用にアドレス指定されたメッセージを送信します (基本的な zeromq エンベロープ)

テストプログラム

public static void main(String[] o){
    ZContext routerCtx = new ZContext();
    Socket rtr = routerCtx.createSocket( ZMQ.ROUTER);
    rtr.setRouterMandatory(true);
    rtr.bind("tcp://*:5500");

    ZContext clientCtx = new ZContext();
    Socket client1 = clientCtx.createSocket( ZMQ.PULL);
    client1.setIdentity("client1".getBytes());
    client1.connect("tcp://localhost:5500");

    try{
        //Thread.currentThread().sleep(2000);   
        rtr.sendMore("client1");
        rtr.sendMore("");
        rtr.send("Hello!");     

        System.out.println( client1.recvStr());
        System.out.println("Client Received: " + client1.recvStr());

    }catch(Exception e1){
        System.out.println( "Could not send to client1: " + e1.getMessage());
    }

    routerCtx.destroy();
    clientCtx.destroy();
}

結果

予想される結果はprintClient Received: Hello!"ですが、ROUTER はアドレス指定できないメッセージと一致する例外をスローします。このような状況でその例外をスローするために使用setRouterMandatory(true)していますが、クライアントは明示的に ID を設定し、サーバーはその ID に送信するため、例外が発生する理由がわかりません。

一時的な修正

コメントを外してわずかな遅延を追加するThread.currentThread().sleep(2000);と、メッセージは正常に配信されますが、スリープと待機の使用を軽蔑し、厄介で脆弱なコードを作成しますが、さらに重要なことに、「なぜ?」に答えません。

質問

  • なぜこうなった?「後期参加」は PUB/SUB ソケットにのみ適用されると理解していました。
  • PULL with ROUTER は無効なソケットの組み合わせですか? チャット プログラムに使用していますが、この問題を除けば、うまく機能します。
4

1 に答える 1