我使用Socket.IO让客户端网页动态地从我的Node.JS服务器获取数据。在服务器端,我使用zeromq库(REQ/REP结构,参见zguide中的rrclient.js示例)将请求转发到Python后端。
但是,由于我的服务器充当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套接字使用socket.on('message',function(){})响应请求,实际上不返回任何内容。
如何使用socket.on('message',function(){});将值返回到启动socket.send()请求的特定函数?
换句话说,如何获得客户端的socket.io请求,让Node.JS使用ZMQ从python后端获取相关数据,然后将其返回给socket.io客户机?(当然是以非阻塞的方式)
发布于 2012-09-24 14:06:35
我也做过类似的事情,你会想要这样做的;
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并将其与响应一起发送回来。
https://stackoverflow.com/questions/12544612
复制相似问题