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

时间:2017-05-03 17:28:05

标签: zeromq jzmq reliable-multicast

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

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

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

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

使用相同的Socket是否有使用send()recv()的替代方法?

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

1 个答案:

答案 0 :(得分:1)

无线电广播绝不会将您的声音传送到主电台

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

如何做你要求的事情?(......忘了使用pgm://

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

您还需要选择适当的传输类,以便在配置的ZeroMQ端点之间的 .bind() + .connect() 中使用。

// -------------------------------------------------------- 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();
// ----------------------