【问题标题】:Node.js and zeroMQ request and responseNode.js 和 zeroMQ 请求和响应
【发布时间】:2014-08-15 23:48:39
【问题描述】:

我已经构建了两个 Javascript 文件,我在 zeroMQ 和 node.js 中实现了响应者和请求者。一旦我启动它们,第一个发送所有请求,但第二个代码 sn-p 没有收到它们。我将它们绑定到相同的地址和端口。对吗?

这里是请求者:

// 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 中,端口地址格式错误!现在一切正常!

【问题讨论】:

    标签: javascript node.js zeromq


    【解决方案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 取决于您的情况。

    【讨论】:

    • 嗨,杰森,谢谢您的回复。我转到 req_rep 示例。他们在那里使用“绑定”命令。如果请求和响应在同一个文件中,它工作正常。但是当我将响应者移动到另一个 javascript 文件时,没有任何效果。你知道那个例子吗?我把它贴在你的答案下面。也许你可以在那里帮助我。这正是我需要的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2018-01-05
    相关资源
    最近更新 更多