SocketIO断开留下套接字听力

时间:2015-02-23 19:09:13

标签: node.js sockets coffeescript socket.io

我正在尝试使用SocketIO结合Redis Pub / Sub来监控应用程序中的事件。到目前为止,我有类似于服务器的以下内容

io.on 'connection', (socket) ->
  log.info "Connection established. [Socket: #{socket.id}]"

  socket.on 'join_room', (roomName) ->
    log.info "Join room '#{roomName}'. [Socket: #{socket.id}]"
    socket.join roomName

  redis.on 'message', (redisChannel, message) ->
    message = JSON.parse message
    log.info "Room: #{message.room} - Event: #{message.event} - Message: #{message.message}"
    io.sockets.in(message.room).emit(message.event, message.message)

  socket.on 'disconnect', ->
    log.info "Connection destroyed. [Socket #{socket.id}]"

然后,在客户端,我有

  socket = io.connect('http://127.0.0.1:3333/')   
  socket.emit('join_room', 'login_events')
  socket.emit('join_room', 'cj_alerts')

  socket.on 'failed_login', (msg) ->
    console.log msg

  socket.on 'successful_login', (msg) ->
    console.log msg

当服务器运行时,我可以使用$redis.publish 'redisChannel', {:room => 'room', :event => 'failed_login', :message => 'message'}.to_json来正确触发redis.on 'message'位。事实上,一切都运作良好。

当我刷新客户端代码所在的页面而不重新启动服务器时,问题就出现了。我的"连接被破坏"日志正确,但似乎连接永远不会真正死亡。每次刷新时,都会添加另一个侦听器。下面的截图应该有助于澄清我的意思。

每个"连接被破坏" /"建立连接"发信号刷新。

enter image description here

我还假设客户端的代码基于每个浏览器窗口。但是,即使我打开一个新的浏览器,我也会得到输出,其中所有事件正在应用于每个窗口。

任何关于它为什么会这样做的提示以及正确的方法都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

问题是由我的redis.on 'message'侦听器的位置引起的。我在每个创建的套接字上都存在这种情况。实际上,我只需要在全球意义上倾听它,然后然后消息任何房间。这看起来像这样:

io.on 'connection', (socket) ->
  log.info "Connection established. [Socket: #{socket.id}]"

  socket.on 'join_room', (roomName) ->
    log.info "Join room '#{roomName}'. [Socket: #{socket.id}]"
    socket.join roomName

  socket.on 'disconnect', ->
    log.info "Connection destroyed. [Socket #{socket.id}]"

redis.on 'message', (redisChannel, message) ->
  message = JSON.parse message
  log.info "Room: #{message.room} - Event: #{message.event} - Message: #{message.message}"
  io.sockets.in(message.room).emit(message.event, message.message)