Node.js和zeroMQ请求和响应

Node.js and zeroMQ request and response

本文关键字:求和 响应 请求 zeroMQ js Node      更新时间:2023-09-26

我已经构建了两个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);
});

编辑:找到答案了!在文件1中,端口地址格式错误!现在一切正常了!

您已经在通信的两侧使用了connect,您需要一侧到connect,另一侧到bind到地址:端口。通常情况下,您将选择充当"服务器"的一方或绑定更可靠的一方,并且您将与"客户端"连接,或者将来来去去的一方。这看起来只是一个基本的例子,所以你选择哪条边是哪条并不重要。

作为示例,我将假设您希望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,这只是从您的代码中删除了异步关注点,您是否想在生产中使用bindbindSync取决于您的情况。