从zmq套接字返回值

时间:2012-09-22 14:27:19

标签: node.js socket.io zeromq pyzmq

我正在使用Socket.IO让客户端网页从我的Node.JS服务器动态获取数据。在服务器端,我使用zeromq套接字库将请求转发到Python后端(REQ / REP结构,请参阅zguide中的rrclient.js示例)。

但是,由于我的服务器充当socket.io服务器,我必须按如下方式包装我的响应,以便将其发送回特定客户端:

socket.on('app_request',function(appRequest){
      //route this request to the backend.
      var results = fetch_data(appRequest);
      //return it to the client
      socket.emit('app_results',results);
  });

所以fetch_data函数使用zmq套接字(socket.send)将请求推送到服务器。

但Node ZMQ套接字使用socket.on('message',function(){})响应请求;听众并没有实际返回任何东西。

我如何使用socket.on('message',function(){});将值返回给发起socket.send()请求的特定函数?

换句话说,如何让客户端的socket.io请求让Node.JS使用ZMQ从python后端获取相关数据,然后将其返回给socket.io客户端? (当然是以非阻塞的方式)

1 个答案:

答案 0 :(得分:2)

我做过类似的事情,你会想要像这样重做;

socket.on('app_request',function(appRequest){
  //route this request to the backend.
  fetch_data(appRequest, function(err, results) {
       socket.emit('app_results',results);
  });
});

zmq是非阻塞的,所以在将它发送到socket.io之前没有收到响应,使用这种方法你可以调整你的fetch_data方法来存储回调,直到返回响应,然后激活它。

粗糙的fetch_data仅用于灵感而未经过测试;

var zmq = require('zmq'),
    req = zmq.socket('req'),
    count = 0,
    jobs = {};


req.on('message', function(response) {
    var args  = JSON.parse(response),
        reply = args[0],
        id    = args[i];

    if (id && jobs[id]) {
         jobs[id].apply(null, Array.isArray(reply) ? reply : [reply]);

         delete jobs[id];
    }
}

function fetch_data(appRequest, callback) {
    var data = JSON.stringify([appRequest, count]);

    jobs[count] = callback;

    req.send(data);

    ++count;
}

然后在另一边解析json并保留id并将其发送回响应。