首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从zmq套接字返回值

从zmq套接字返回值
EN

Stack Overflow用户
提问于 2012-09-22 14:27:19
回答 1查看 1.9K关注 0票数 3

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

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

代码语言:javascript
运行
复制
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套接字使用socket.on('message',function(){})响应请求,实际上不返回任何内容。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-24 14:06:35

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

代码语言:javascript
运行
复制
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为灵感,只有没有测试;

代码语言:javascript
运行
复制
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并将其与响应一起发送回来。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12544612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档