繁体   English   中英

Node.js 与 ZeroMQ + Socket.io + 每个客户端的范围

[英]Node.js with ZeroMQ + Socket.io + scoping per client

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

这个概念是:node.js 应用程序通过订阅 ZeroMQ 发布者将完整的 aprs stream 发送给它。 当用户访问 web 页面(全屏 map)时,将设置 socket.io session 并将 map 当前可见区域的边界发送回服务器。 服务器然后可以 scope 完整的提要仅向用户发送 map 上的新点。

它的大部分运行良好,但当不止一个人加载该站点时它就会中断。 当前查看的 map 的 scope 变为全局,如果您缩放/平移一个 map,它将开始向两个浏览器显示新位置上的点。

我需要每个 socket.io session 保留其自己的 scope 并且仅从其唯一范围的 map 边界接收数据并且对每个访问者都是唯一的。 我试过在 socket.io 连接中嵌套zmqsocket.on "message", (data) ->回调,但它仍然产生相同的结果(即使在正确的回调中声明了 mapbounds 变量。)

该应用程序的完整源代码可在此处找到: https://github.com/gmcintire/aprs.bz

如果您想在本地测试该应用程序,您应该能够克隆我的存储库,运行npm install ,然后启动coffee app.coffee 请注意,它将开始从我的 ZeroMQ 服务器流式传输完整的 APRS 提要,这可能是 ~100KBytes/sec。

app.coffee

express = require("express")
routes = require("./routes")
geolib = require("geolib")
zmq = require("zmq")
zmqsocket = zmq.socket("sub")

zmqsocket.connect "tcp://stream.aprs.bz:12777"
zmqsocket.subscribe ""
app = module.exports = express.createServer()
io = require("socket.io").listen(app)

mapbounds = ""

io.sockets.on "connection", (socket) ->
  #console.log socket
  socket.on "mapmove", (mapcoords) ->
    console.log mapbounds
    mapbounds = mapcoords

zmqsocket.on "message", (data) ->
  packet = JSON.parse(data)
  #console.log packet

  if packet.latitude? and packet.longitude? and (mapbounds != "")
    insideMap = geolib.isPointInside
      latitude: packet.latitude
      longitude: packet.longitude
    , [
      latitude: mapbounds._northEast.lat
      longitude: mapbounds._southWest.lng
    ,
      latitude: mapbounds._northEast.lat
      longitude: mapbounds._northEast.lng
    ,
      latitude: mapbounds._southWest.lat
      longitude: mapbounds._northEast.lng
    ,
      latitude: mapbounds._southWest.lat
      longitude: mapbounds._southWest.lng
    ]
    if insideMap
      console.log "\n--------------------------------------------------------\n"
      io.sockets.emit "packet", packet
      console.log packet

app.configure ->
  app.set "views", __dirname + "/views"
  app.set "view engine", "jade"
  app.use express.bodyParser()
  app.use express.methodOverride()
  app.use app.router
  app.use express.static(__dirname + "/public")

app.configure "development", ->
  app.use express.errorHandler(
    dumpExceptions: true
    showStack: true
  )

app.configure "production", ->
  app.use express.errorHandler()

app.get "/", routes.index
if app.settings.env == "development"
  app.listen 3000
else
  app.listen 80

console.log "Express server listening on port %d in %s mode", app.address().port, app.settings.env

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

我没有使用 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");

或者使用一个集合来 map 每个套接字与其相关的变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM