Node.js 绑定前连接时套接字忙
我正在使用将消息从node.js服务器推送到我的工作人员。我在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!'); } 并使用员工代码中的经销商连接到
路由器
套接字
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()
回调中解析另一个。然后,您通常可以做一些事情,比如等待承诺列表,在本例中,这将包含上面提到的两个承诺。