Node.js和zeroMQ请求和响应

我build立了两个Javascript文件,在zeroMQ和node.js中实现一个响应者和请求者。 一旦我开始他们,第一个发送所有请求,但第二个代码片段不接收它们。 我将它们绑定到相同的地址和端口。 是对的吗?

这是请求者:

// Erstelle zeroMQ-Socket var zmq = require('zmq') var requester = zmq.socket('req'); // Request-Client verbindet sich mit TCP-Socket requester.connect('tcp://localhost:5000'); var replyNbr = 0; // Erhalte Nachricht auf Request requester.on('message', function(msg) { console.log('got reply', replyNbr, msg.toString()); replyNbr += 1; }); // Sende request an Server for (var i = 0; i < 10; ++i) { requester.send("Hello"); console.log("Sende Request" + (i+1)); } 

这是响应者:

 // Erstelle Socket-Verbindung var zmq = require('zmq') var responder = zmq.socket('rep'); // Verbinde zum TCP-Socket responder.connect('tcp://localhost:5000'); console.log('Warte auf Request...'); // Warten bis Request ankommt responder.on('message', function(msg) { console.log('received request:', msg.toString()); // Warte eine Sekunde und schicke Antwort setTimeout(function() { responder.send("World"); }, 1000); }); 

修改以包含下面答案中发布的信息:

我现在转到zmq node_modules目录的req_rep.js例子。 有这样的例子:

 /* * * One requester two responders (round robin) * */ var cluster = require('cluster') , zeromq = require('zmq') , port = 'tcp://127.0.0.1:12345'; if (cluster.isMaster) { //Fork servers. for (var i = 0; i < 2; i++) { cluster.fork(); } cluster.on('death', function(worker) { console.log('worker ' + worker.pid + ' died'); }); //requester = client var socket = zeromq.socket('req'); socket.identity = 'client' + process.pid; socket.bind(port, function(err) { if (err) throw err; console.log('bound!'); setInterval(function() { var value = Math.floor(Math.random()*100); console.log(socket.identity + ': asking ' + value); socket.send(value); }, 100); socket.on('message', function(data) { console.log(socket.identity + ': answer data ' + data); }); }); } else { //responder = server var socket = zeromq.socket('rep'); socket.identity = 'server' + process.pid; socket.connect(port); console.log('connected!'); socket.on('message', function(data) { console.log(socket.identity + ': received ' + data.toString()); socket.send(data * 2); }); } 

这工作正常,但是当我试图让请求者在一个文件和响应者在一个文件中,没有任何工作了。 有人可以帮我吗?

文件1:

 // Requester (bildet Webserver ab) // zmq und Adresse einbinden var zeromq = require('zmq') , port = 'tcp://127.0.0-1:12345'; // socket erstellen und an Adresse binden var socket = zeromq.socket('req'); socket.identity = 'client' + process.pid; socket.bind(port); console.log('An Port gebunden'); setInterval(function() { var value = Math.floor(Math.random()*100); console.log(socket.identity + ': Anfrage ' + value); socket.send(value); }, 2000); socket.on('message', function(data) { console.log(socket.identity + ': Antwort von Responder ' + data); }); 

文件2:

 // Erstelle Socket-Verbindung var zeromq = require('zmq') , port = 'tcp://127.0.0.1:12345'; var socket = zeromq.socket('rep'); socket.identity = 'server' + process.pid; // Responder mit Adresse verbinden socket.connect(port); console.log('connected!'); // Auf Anfrage des Client warten socket.on('message', function(data) { console.log(socket.identity + ': Erhalten ' + data.toString()); socket.send(data * 2); }); 

编辑:find灵魂! 在文件1中,端口地址格式错误! 现在一切正常!

你已经使用了通讯双方的连接,你需要一端connect ,另一端bind到地址:端口。 通常情况下,你会select扮演“服务器”angular色的一面,或者select一个更可靠的angular色扮演angular色,而且你会连接到“客户端”,或者将来去的一面。 这看起来只是一个基本的例子,所以select哪一方并不重要。

为了举例,我假设你想让你的REP套接字绑定:

 // Erstelle Socket-Verbindung var zmq = require('zmq') var responder = zmq.socket('rep'); // Verbinde zum TCP-Socket responder.bindSync('tcp://localhost:5000'); console.log('Warte auf Request...'); 

…你会看到我使用bindSync ,这只是从您的代码中删除asynchronous的关注,是否要在生产中使用bindbindSync取决于您的情况。