Node.js和zeroMQ请求和响应

时间:2014-06-25 12:07:48

标签: javascript node.js zeromq

我已经构建了两个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中,端口地址格式错误!现在一切正常!

1 个答案:

答案 0 :(得分: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,只是从您的代码中删除了异步问题,无论您是想在生产中使用bind还是bindSync取决于您的情况。