3

我正在使用zeromq将消息从 node.js 服务器推送到我的工作人员。router我在 node.js 端创建了一个套接字

var sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
  if (err) {
    console.log( 'Error binding socket' );
    return;
  }
  console.log('OK!');
}

dealer并使用工作代码中的a 连接到该地址。

当工作人员首先连接时出现问题,在绑定之前(并非总是如此,但经常如此)。这应该不是 zeromq 文档的问题,所以我认为这是node.js 绑定的问题,问题是我该如何解决这个问题?

还有一个问题,我可以在函数中捕获此异常Socket is busyprocess.on('uncaughtException',...)而不是在bind函数中

我应该提到我正在 Windows 7 64 位上执行此操作。

4

1 回答 1

7

问题可能是您使用的是 bind(),而实际上您应该使用的是 bindSync()。当您阅读源代码时,您会发现 async bind() 实际上会锁定套接字在每次对它执行任何操作时检查锁定。您可能遇到的情况是工作人员在套接字解锁之前连接,因此会引发异常。只是用 bindSync() 替换 bind() 对我有用。然而,我猜这不是一个理想的解决方案,或者说不是非常 node.js-ish。让我们证明我的意思:

var zmq = require('zmq')
  , sender;
sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
  if (err) {
    console.log( 'Error binding socket' );
    return;
  }
  sender.close(); // This is fine! The socket is ready!
});

sender.close(); // This is wrong! The socket is not ready yet!

所以你可以调用 bindSync() 并且不关心,或者调用 bind() 并在回调中继续工作,但你绝对不能使用 bind() 并在不等待它完成的情况下继续。bindSync() 使代码更易于阅读,但您在调用期间阻塞了整个 node.js 实例。所以我认为 bind() 方式在应该使用 node.js 的方式上更干净......

希望这有帮助;-)

于 2013-01-15T11:45:41.823 回答