【问题标题】:How to resolve this Exception, thrown from ZeroMQ library?如何解决从 ZeroMQ 库抛出的这个异常?
【发布时间】:2017-10-03 07:06:22
【问题描述】:

我在 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;

【问题讨论】:

    标签: android zeromq


    【解决方案1】:

    这是 ZeroMQ 中的常见状态。 .bind() 询问,但操作系统可以并且确实拒绝...

    操作系统简单地拒绝允许 .bind() 方法接触这样的<address>:<port#>,O/S-resource-manager 仍然认为它不是免费的并且可用于任何资源在通话时使用。


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

    错误处理
    绑定应该使用语言的标准错误机制,无论是错误代码、异常等。

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

    在原型制作过程中,通常会陷入死锁或尚未发布的地址:端口,因此有时仅使用外部重置,重新启动可以提供缺失的步骤以使玩具按预期进行相应的操作。

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

    所以,请继续关注并享受 ZeroMQ 带来的 的强大功能。

    【讨论】:

    • 为什么不呢?只需创建一个合适的 UI 引擎,允许您控制和重新分发所有 UI 内容,添加 { local + remote }-event-collection + 传播到一个通用的 { local }-UI-controller 就差不多了。一些身份验证,一些加密保护。所以,非常可行。
    【解决方案2】:

    ZMQ.REP / ZMQ.REQ 需要成对操作 send、recv、send、recv... 如果您的消息传递是单向的,请考虑使用 ZMQ.PULL / ZMQ.PUSH 代替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多