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