2

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

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

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

如果ZMQ.SUB使用,send()则不起作用。

有没有其他方法可以同时使用send()recv()使用同一个 Socket?

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

1 回答 1

1

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

是的,ZeroMQ PUB/SUBScalable Formal Communication Pattern 的原型的两个部分都是单向的(根据定义),一个可以.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();
// ----------------------
于 2017-05-03T18:34:58.243 回答