我正在使用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();
答案 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();
// ----------------------