Node.js ZeroMQ客户端不会与C ZeroMQ服务器交换REQ / REP消息

使用ZeroMQ文档提供的示例,我无法让它们与用C编写的服务器和node.js客户端一起工作。

我使用的例子是:

  • http://zguide.zeromq.org/js:rrclient
    对于Node.js:

// Hello World client in Node.js // Connects REQ socket to tcp://localhost:5559 // Sends "Hello" to server, expects "World" back var zmq = require('zmq') , requester = zmq.socket('req'); requester.connect('tcp://localhost:5560'); var replyNbr = 0; requester.on('message', function(msg) { console.log('got reply', replyNbr, msg.toString()); replyNbr += 1; }); for (var i = 0; i < 10; ++i) { requester.send("Hello"); } 

  • https://github.com/booksbyus/zguide/blob/master/examples/C/rrworker.c
    对于C服务器:

 // Hello World worker // Connects REP socket to tcp://localhost:5560 // Expects "Hello" from client, replies with "World" #include "zhelpers.h" #include <unistd.h> int main (void) { void *context = zmq_ctx_new (); // Socket to talk to clients void *responder = zmq_socket (context, ZMQ_REP); //zmq_connect (responder, "tcp://localhost:5560"); // using bind instead of connect zmq_bind (responder, "tcp://localhost:5560"); while (1) { // Wait for next request from client char *string = s_recv (responder); printf ("Received request: [%s]\n", string); free (string); // Do some 'work' sleep (1); // Send reply back to client s_send (responder, "World"); } // We never get here, but clean up anyhow zmq_close (responder); zmq_ctx_destroy (context); return 0; } 

我改变了港口,所以他们现在匹配(5560)。 但是我没有传输数据。 客户端和服务器都不会收到任何消息。

为什么? 他们只是一直在听

哪里?

 requester.connect(..) // in Node.js copy/paste code 

RESP。

 zmq_connect ( responder, "tcp://localhost:5560" ); // in C copy/paste code 

ZeroMQ信令/消息传递基础结构的逻辑有点复杂。

REQ/REP一方必须.bind() ,其他所有人都可以尝试 .connect()

这在原理上是有效的,适用于所有ZeroMQ可扩展forms通信模式原型,而不仅仅是REQ / REP。

所以,在这个用例中,
任何一方 – 无论是Node.js还是C – 都可能以.bind()

另一个将能够尝试.connect()这样.bind()准备好和准备好的IP:port#目标。

  .. int rc = zmq_bind( responder, "tcp://localhost:5560" ); /* zmq_bind() returns: * zero if successful. * -1 otherwise and sets errno to one of the values as defined in API. */ .. 

在ZeroMQ领域有很多好的做法。 注册和处理来自函数调用的返回代码就是ZeroMQ最佳实践中的一个主题。 不要犹豫, 快速学习 ,阅读这里的许多人多年的集体经验。

绑定到本地似乎并没有工作,所以我尝试了127.0.0.1,它的工作原理。