我正在使用 node.js 和 express 编写一个 Web 应用程序,以通过 ZeroMQ 和 socket.io 向每个用户提供实时aprs流。
这个概念是:node.js 应用程序通过订阅 ZeroMQ 发布者将完整的 aprs 流发送给它。当用户访问网页(全屏地图)时,socket.io 会话被建立并将地图当前可见区域的边界发送回服务器。然后,服务器可以将完整提要的范围限定为仅将地图上的新地点发送给用户。
其中大部分运行良好,但是当超过一个人加载该站点时它会中断。当前查看的地图的范围变为全局,如果您缩放/平移一张地图,它将开始向两个浏览器显示新位置上的点。
我需要每个 socket.io 会话保留自己的范围,并且只从其唯一范围的地图边界接收数据,并且对每个访问者都是唯一的。我尝试将zmqsocket.on "message", (data) ->
回调嵌套在 socket.io 连接中,但它仍然产生相同的结果(即使在正确的回调中声明了 mapbounds 变量。)
可以在此处找到该应用程序的完整源代码:https ://github.com/gmcintire/aprs.bz
如果你想在本地测试应用程序,你应该可以克隆我的 repo,运行npm install
,然后coffee app.coffee
开始。请注意,它将开始从我的 ZeroMQ 服务器流式传输完整的 APRS 提要,这可能是 ~100KBytes/sec。
应用程序.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