SocketIO 断开连接离开套接字侦听
SocketIO Disconnect Leaving Socket Listening
我正在尝试结合使用 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'
位正确触发。事实上,一切都很好。
在没有重启服务器的情况下刷新客户端代码所在的页面时出现问题。我的 "Connection destroyed" 日志正确显示,但似乎连接从未真正中断。每次刷新时,都会添加另一个侦听器。下面的屏幕截图应该有助于阐明我的意思。
每个 "Connection destroyed"/"Connection established" 表示刷新。
我还假设客户端的代码将基于每个浏览器 window。然而,即使当我打开一个新的浏览器时,我得到的输出显示 all 事件正在应用于每个 window.
如果能提供任何有关它为何如此运作以及正确方法的提示,我们将不胜感激。
问题是由我的 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)
我正在尝试结合使用 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'
位正确触发。事实上,一切都很好。
在没有重启服务器的情况下刷新客户端代码所在的页面时出现问题。我的 "Connection destroyed" 日志正确显示,但似乎连接从未真正中断。每次刷新时,都会添加另一个侦听器。下面的屏幕截图应该有助于阐明我的意思。
每个 "Connection destroyed"/"Connection established" 表示刷新。
我还假设客户端的代码将基于每个浏览器 window。然而,即使当我打开一个新的浏览器时,我得到的输出显示 all 事件正在应用于每个 window.
如果能提供任何有关它为何如此运作以及正确方法的提示,我们将不胜感激。
问题是由我的 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)