Node.js与ZeroMQ+;Socket.io+;每个客户端的作用域

Node.js与ZeroMQ+;Socket.io+;每个客户端的作用域,node.js,socket.io,zeromq,Node.js,Socket.io,Zeromq,我正在使用node.js和express编写一个web应用程序,通过ZeroMQ和socket.io向每个用户提供实时流 其概念是:node.js应用程序通过订阅ZeroMQ发布服务器向其发送完整的aprs流。当用户访问网页(全屏地图)时,将设置socket.io会话,并将地图当前可见区域的边界发送回服务器。然后,服务器可以确定完整提要的范围,只向用户发送地图上的新点 大部分工作正常,但当超过一个人加载站点时,它就会崩溃。当前查看地图的范围将变为全局,如果缩放/平移一张地图,它将开始向两个浏览器

我正在使用node.js和express编写一个web应用程序,通过ZeroMQ和socket.io向每个用户提供实时流

其概念是:node.js应用程序通过订阅ZeroMQ发布服务器向其发送完整的aprs流。当用户访问网页(全屏地图)时,将设置socket.io会话,并将地图当前可见区域的边界发送回服务器。然后,服务器可以确定完整提要的范围,只向用户发送地图上的新点

大部分工作正常,但当超过一个人加载站点时,它就会崩溃。当前查看地图的范围将变为全局,如果缩放/平移一张地图,它将开始向两个浏览器显示新位置上的点

我需要每个socket.io会话保留自己的作用域,只接收来自其唯一作用域映射边界的数据,并且对每个访问者都是唯一的。我已经尝试将
zmqsocket.on“message”(数据)->
回调嵌套在socket.io连接中,但它仍然会产生相同的结果(即使在正确的回调中声明了mapbounds变量)

该应用程序的完整源代码可在以下位置找到:

如果您想在本地测试应用程序,您应该能够克隆my repo,运行
npm install
,然后
coffee app.coffee
启动。请注意,它将开始从我的ZeroMQ服务器流式传输完整的APRS源,速度可能约为100KB/秒

app.coffee
我没有喝咖啡的经验,但我可以看到您正在全局存储变量

var mapboudns = 10
io.sockets.on('connection', function(socket){
    socket.on("msg", function(data){
      mapbounds = data.bounds; //new value of mapbounds is altered globally
    });
});
尝试使用以下方法:

socket.set("mapbounds", someNewValue);
要稍后获取值,请执行以下操作:

socket.get("mapbounds");

或者使用集合将每个套接字映射到其相关变量

我也不是CS或ZMQ的人,但听起来好像你在向太多客户机广播数据
io.sockets.emit
将向所有连接的套接字发送事件。如果您只想将数据发送到一个套接字,则应使用
socket.emit
,其中
socket
已设置为单个套接字对象。

只是一个旁注,但我相信您需要通过回调来获取(key,fn)以检索值:感谢您的帮助。我曾尝试将每个套接字映射到数组中与其相关的变量,但始终得到相同的结果,只在全局范围中引用它。感谢您帮助我忽略了这一疏忽。因为我没有使用sockets.broadcast,所以我认为它不会发送给所有客户,但你是对的。将整个
zmqsocket.on“message”、(data)->
事件侦听器嵌套在
io.sockets.on“connection”、(socket)->
中,并将其更改为
socket.emit
效果非常好。非常感谢。
socket.get("mapbounds");