在 JZMQ 中通过相同的 Socket 发送和接收数据

Send and Receive data through same Socket in JZMQ

我正在使用 JZMQ(PGM 协议)开发 JAVA 多播应用程序。

是否可以通过同一个套接字发送和接收数据?

如果使用ZMQ.PUB,只有send()有效,recv()无效。

如果使用ZMQ.SUB,则send()无效。

有没有其他方法可以使用同一个套接字同时使用 send()recv()

ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.PUB);
socket.send(msg);
socket.recv();

无线电广播永远不会将您的声音传送到主站

是的,ZeroMQ PUB/SUB 可扩展正式通信模式的原型 的两个部分都是单向的(根据定义) 一个可以 .send(),其他的可以只听(如果配置好,他们会的)。


如何完成您的要求?(...忘记使用 pgm://

是的,有一些方法可以为此使用其他 ZeroMQ 原型——即 PAIR/PAIR 端点上的单个套接字(能够同时支持 .send().recv()方法)或一对(A)->--PUSH/PULL->-(B)+(A)-<-PULL/PUSH-<-(B)构造双向信令/ 仅使用单向原型的消息传递通道。

您还需要select一个合适的传输-class用于.bind() + .connect() 在配置的 ZeroMQ 端点之间。

// -------------------------------------------------------- HOST-(A)
   ZMQ.Context aCONTEXT   = ZMQ.context( 1 );

   ZMQ.Socket  aPubSOCKET = aCONTEXT.socket( ZMQ.PUB );
               aPubSOCKET.setsockopt(        ZMQ.LINGER, 0 );
// ----------------------
               aPubSOCKET.bind( "tcp://*:8001" );
// ----------------------
// set msg = ...;
// ----------------------
               aPubSOCKET.send( msg, ZMQ.NOWAIT );

// ...
// ----------------------
               aPubSOCKET.close();
               aCONTEXT.term();
// ----------------------

SUB方还有一项职责...

// -------------------------------------------------------- HOST-(B)
   ZMQ.Context aCONTEXT   = ZMQ.context( 1 );

   ZMQ.Socket  aSubSOCKET = aCONTEXT.socket( ZMQ.SUB );
               aSubSOCKET.setsockopt(        ZMQ.LINGER,     0 );
               aSubSOCKET.setsockopt(        ZMQ.SUBSCRIBE, "" );
// ----------------------
               aSubSOCKET.connect( "tcp://<host_A_IP_address>:8001" );
// ----------------------
// def a msg;
// ----------------------
         msg = aSubSOCKET.recv( ZMQ.NOWAIT );

// ...
// ----------------------
               aSubSOCKET.close();
               aCONTEXT.term();
// ----------------------