Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 绑定前连接时套接字忙_Node.js_Zeromq - Fatal编程技术网

Node.js 绑定前连接时套接字忙

Node.js 绑定前连接时套接字忙,node.js,zeromq,Node.js,Zeromq,我正在使用将消息从node.js服务器推送到我的工作人员。我在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!'); } 并使用员工代码中的经销商连接到

我正在使用将消息从node.js服务器推送到我的工作人员。我在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!');
}
并使用员工代码中的
经销商连接到此地址

在绑定之前,当工作进程首先连接时会出现问题(不总是,但经常)。关于zeromq文档,这不应该是一个问题,所以我认为这是一个问题,问题是我如何解决这个问题

还有一个问题是,我可以在
进程中捕获此异常
套接字正忙。在('uncaughtException',…)
上,而不是在
绑定
函数中


我应该提到,我是在windows 7 64位上执行此操作的。

问题可能是您使用的是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


希望这有帮助;-)

到底发生了什么问题?您也可以尝试用Python或其他语言重写相同的内容,看看问题是否仍然存在。@tchap路由器无法绑定此消息。对于类似的代码,我没有遇到过这样的问题(但是我没有尝试转换相同的代码…我会尝试,好主意)。连接两个异步绑定/连接以使回调仅在两个连接后运行的最佳方法是什么。这是一个典型的异步回调问题,不是吗?ZMQ支持承诺吗?我想您可以准备两个承诺,并在一个
bind()
回调中解析一个,在另一个
bind()
回调中解析另一个。然后,您通常可以做一些事情,比如等待承诺列表,在本例中,这将包含上面提到的两个承诺。