【发布时间】:2017-05-05 06:28:38
【问题描述】:
我正在使用 socket.io 创建一个实时游戏。目前,当有人离开时,什么也没有发生。我想以某种方式通知服务器说谁离开了。有没有办法在用户离开时发出正确的东西?我可以让服务器每 1000 毫秒 ping 一次每个人,或者告诉谁还在连接吗?
【问题讨论】:
标签: javascript jquery html sockets socket.io
我正在使用 socket.io 创建一个实时游戏。目前,当有人离开时,什么也没有发生。我想以某种方式通知服务器说谁离开了。有没有办法在用户离开时发出正确的东西?我可以让服务器每 1000 毫秒 ping 一次每个人,或者告诉谁还在连接吗?
【问题讨论】:
标签: javascript jquery html sockets socket.io
在关闭窗口/页面之前发出包含用户详细信息的事件,添加事件侦听器以侦听该通道。事件侦听器可以从收到的消息中获取用户详细信息并显示它。
草稿:
// server code
socket.on('user_left', function(user){
// broadcast user to channel 'user_left_group'
});
// browser - for other users
socket.on('user_left_group', function(user){
// code to show user left
}
// browser - to say I am leaving
socket.emit('user_left', myname);
【讨论】:
离开意味着什么?
关闭应用程序?关闭窗户?关闭系统?互联网没了?我觉得都是一样的
您可以使用断开连接事件,一旦套接字断开连接(套接字,而不是用户,因为 Node 只知道套接字),您将必须找出谁是该套接字的“所有者”并将他标记为“断开连接” ”。
但我建议您必须等待几秒钟,因为即使在页面重新加载或导航到另一个页面时也会触发断开连接事件。
因此,根据解决方案,您可以创建一个每隔 X 秒运行一次的观察程序,并在用户不拥有任何套接字或长时间没有活动时将其标记为已断开连接。
查看 Socket.io 文档了解更多详情: https://github.com/socketio/socket.io
Socket#disconnect(close:Boolean):Socket
断开此客户端。如果 close 的值为 true,则关闭底层 > 连接。否则,它只会断开命名空间。
活动
断开连接
断开连接时触发。
【讨论】:
首先,设置超时会使套接字对象失效。它们是实时的,因此一旦触发事件,就会启动流程。 Socket.io 有一个名为 disconnect 的事件,您可以收听该事件并将其发送给当前连接的所有用户。例如:
服务器
io.on('connection', function(socket) {
const _id = socket.id
socket.on('disconnect', function() {
io.emit('userLeft', {message: _id + ' left the room'}
})
})
客户
socket.on('userLeft', function(data) {
document.querySelector('.notification').innerHTML = data
})
【讨论】: