0

ZeroMQ私は Java で書かれたプログラムを持っています。このプログラムは、実行中の別のプログラムによってリッスンされ、応答されるようにメッセージを送信する必要があります。

ZeroMQ問題は、リスナーがローカル ネットワーク上の別のコンピューター上にあり、ネットワーク経由でメッセージを受信するために何らかの方法でポート フォワーディングを実行する必要があることです。

    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket requester = context.socket(ZMQ.REQ);
    requester.connect("tcp://192.168.78.14:5570"); //192.168.78.14 is the address of listening machine

    String msg = "Message";
    requester.send(msg.getBytes());

    byte[] reply = requester.recv();

上記のコードが実行されると、プログラムは応答を無期限に待機する (決して応答しない) ため、実質的に応答しなくなります。リスナーはtcp://127.0.0.1:5570メッセージをリッスンしています。tcp://0.0.0.0:5570またはに設定するとtcp://*:5570、特定のポートですべてのアドレスをリッスンするように設定しても、何も得られません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

host:portこのソリューションは、空間的に分散された仮想マシンの大規模なグループが、それぞれの実際のネットワーク アドレス空間での実際のインスタンス化とは関係なく、同様のセッションをライブにする必要があるため、過去 20 年間、既に運用環境で使用されています。


ssh-port-forwardingホスト間のトンネルを使用する

ソリューションは、原則として、ZeroMQフレームワークのセットアップとは無関係です。

希望する 2 つのホスト間にライブ SSH 接続をセットアップします。

通信設定で使用される -sに従って、それぞれの端で、それぞれのポート転送マッピングを提供します。port#ZeroMQ

ローカルポートをリモートターゲットに転送する場合host A 192.168.78.145570IP:port#

L5570 forward to 192.168.78.15:5570

host A通信パターンでは、ZeroMQ透過的にローカル ポートに「話しかけ」ます。これは、反対側のホストに転送され、さらにソケット トラフィックを処理するために参照されたポートに配信されるトンネル5570のサービスによって行われます。sshB5570

通信パターンでは、通信相手が同じ「ボックス」に「座っている」かのように、ポートを介してシームレスに「対話」し、そのようなトリックを知らなくても、トンネルを介して実際に配信されたソケットトラフィックを処理します。host B 192.168.78.15ZeroMQ5570ssh

QED。


プロトタイピングをより迅速かつ簡単にするために、どちらかというと.socket(ZMQ.PAIR)アーキタイプを使用することを選択するかもしれません。これは、高レベルの動作パターンを導入せず、ソケット インターフェイスが反対側に送信するように指示されたものを単純に送信します (事前に -reply をZeroMQ待つ必要はありません)。-メッセージ )REPREQ

于 2015-10-21T18:59:38.927 に答える