如何解决从 ZeroMQ 库抛出的这个异常?

How to resolve this Exception, thrown from ZeroMQ library?

我在 android 中使用 ZeroMQ 连接两个设备,但出现异常,即 org.zeromq.ZMQException: Errno 48 : Address already in use

这是我的代码:

ZMQ.Socket socket = context.socket(             ZMQ.REP );
                            socket.setLinger(   0 );
                            socket.setSndHWM(   0 );
                            socket.setIPv4Only( false );
                            socket.bind(       "tcp://myIP:port" );

while( !Thread.currentThread().isInterrupted() ) {
        byte[] msg = socket.recv( 0 );
        uiThreadHandler.sendMessage( Util.bundledMessage( uiThreadHandler,
                                                          new String( msg )
                                                          )
                                     );
        socket.send( new String( Util.reverseInPlace( msg ) ),
                     0
                     );
}
socket.close();
context.term();
}



ZMQ.Context context = ZMQ.context( 1 );
ZMQ.Socket   socket =     context.socket(          ZMQ.SUB );
                                  socket.connect( "tcp://myIP:port" );
                                  socket.send(     params[0].getBytes(),
                                                   0
                                                   );
String result = new String(       socket.recv( 0 ) );
                                  socket.close();
context.term();
return result;

这是 ZeroMQ 中的常见状态。 .bind() 询问,但 O/S 可以并且确实拒绝了 ...

操作系统简单地拒绝允许 .bind() 方法接触这样的 <address>:<port#>,O/S-resource-manager 仍然相信这不是免费的,并且在调用时可以重复使用。


正是出于这个原因,ZeroMQ 文档建议:

Error handling
The binding should use standard error mechanism of the language, whether it is error codes, exceptions etc.

所以正确的异常处理总是留给用户代码。这是设计者的角色和责任,要定义针对这种情况采取哪些步骤和措施来补救接下来将要发生的事情的总体策略。

在原型制作过程中,陷入僵局或尚未发布是很常见的address:port,所以有时只是使用外部重置,重启可以提供缺失的步骤,使玩具按照预期行动.

+1 用于设计具有预防措施的代码...ZMQ_LINGER 是典型的此类案例。始终自动执行此操作。它可以为您节省调试时间。

所以,敬请关注并享受 ZeroMQ 的强大功能。

ZMQ.REP / ZMQ.REQ 需要成对执行 send, recv, send, recv... 如果您的消息是单向的,请考虑使用 ZMQ.PULL / ZMQ.PUSH