Socket.io 如何判断某人何时离开
Posted
技术标签:
【中文标题】Socket.io 如何判断某人何时离开【英文标题】:Socket.io How to tell when somebody leaves 【发布时间】:2017-05-05 06:28:38 【问题描述】:我正在使用 socket.io 创建一个实时游戏。目前,当有人离开时,什么也没有发生。我想以某种方式通知服务器说谁离开了。有没有办法在用户离开时发出正确的东西?我可以让服务器每 1000 毫秒 ping 一次每个人,或者告诉谁还在连接吗?
【问题讨论】:
【参考方案1】:在关闭窗口/页面之前发出包含用户详细信息的事件,添加事件侦听器以侦听该通道。事件侦听器可以从收到的消息中获取用户详细信息并显示它。
草稿:
// 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);
【讨论】:
谢谢!我最终使用 JQuery .unload() 处理程序来执行您所说的操作。效果很好!【参考方案2】:离开意味着什么?
关闭应用程序?关闭窗户?关闭系统?互联网没了?我觉得都是一样的
您可以使用断开连接事件,一旦套接字断开连接(套接字,而不是用户,因为 Node 只知道套接字),您将必须找出谁是该套接字的“所有者”并将他标记为“断开连接” ”。
但我建议您必须等待几秒钟,因为即使在页面重新加载或导航到另一个页面时也会触发断开连接事件。
因此,根据解决方案,您可以创建一个每隔 X 秒运行一次的观察程序,并在用户不拥有任何套接字或长时间没有活动时将其标记为已断开连接。
查看 Socket.io 文档了解更多详情: https://github.com/socketio/socket.io
Socket#disconnect(close:Boolean):Socket
断开此客户端。如果 close 的值为 true,则关闭底层 > 连接。否则,它只会断开命名空间。
活动
断开连接
断开连接时触发。
【讨论】:
感谢您的回答!这也可行,但我最终使用 JQuery .unload() 处理程序在页面关闭时立即发出用户数据。非常感谢您回答想法!【参考方案3】:首先,设置超时会使套接字对象失效。它们是实时的,因此一旦触发事件,就会启动流程。 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
)
【讨论】:
感谢您解释它是如何工作的!我不知道如何使 Sockets 的断开连接部分工作。我最终使用了 JQuery .unload 处理程序,然后将用户的数据发送到我制作的另一个套接字。我确信这会奏效,但我首先找到了其他解决方案。感谢您的回复,我肯定会在我的下一个项目中使用这种技术!以上是关于Socket.io 如何判断某人何时离开的主要内容,如果未能解决你的问题,请参考以下文章
node.js socket.io 应用程序 - 如何将某人踢出聊天室?
如何在Socket.IO中一次性离开套接字连接的所有房间[关闭]