socket io:如何传递参数来断开套接字事件?
Posted
技术标签:
【中文标题】socket io:如何传递参数来断开套接字事件?【英文标题】:socket io: how to pass paramter to disconnet socket event? 【发布时间】:2016-12-05 21:15:14 【问题描述】:我正在使用 socket io 来构建一个聊天应用程序。
当“用户 x”从聊天中断开时,我想打印到控制台日志:“再见用户 x”。
为此,我需要将用户名作为参数传递给断开连接事件。
问题是我不知道如何将数据传递给断开事件:
socket.on('disconnect', function()...)
当用户断开连接时自动调用它。
我需要类似的东西
socket.on('disconnect', function(user_name)
console.log('bye '+user_name);
)
但如果可能的话(是吗?)那么我怎样才能在客户端传递这个参数(我的情况,角度)?
我完整的 socket io server.js 代码如下。
io.on('connection', function(socket)
io.emit('chat_message', "welcome");
socket.on('room', function(room)
socket.join(room);
);
socket.on('chat_message', function(data)
socket.broadcast.to(data.room).emit('chat_message',data.msg);
);
socket.on('info_message', function(data)
socket.broadcast.to(data.room).emit('info_message',data.msg);
);
socket.on('disconnect', function()
console.log('bye '+socket.id);
io.emit('chat message', "Bye");
);
);
【问题讨论】:
我假设您将需要一个辅助函数,该函数最初将房间、用户和套接字 ID 存储在连接时的对象/数组中。断开连接时,您将能够将 socket.id 与对象/数组中的用户名匹配并根据需要显示。 谢谢,socket id 对于每个用户是唯一的还是每个房间唯一的? 好像:socket.io/docs/rooms-and-namespaces -Each Socket in Socket.IO is identified by a random, unguessable, unique identifier Socket#id. For your convenience, each socket automatically joins a room identified by this id.
我不认为你可以:当disconnect
触发时,已经为时已晚......
【参考方案1】:
您不能将数据传递给断开连接事件。但是,您可以在更早的时候将自己的属性附加到 socket
对象,或者您可以保留自己的套接字映射以及其他信息。
您只需要确保服务器知道每个套接字的用户名(我无法从您的问题中判断用户名是客户端还是服务器端的数据)。然后,您可以将其作为属性附加到套接字对象。完成此操作后,当您获得断开连接事件时,您只需查看正在断开连接的套接字上的该属性。
因此,无论用户名信息来自何处,您都可以在服务器知道它是什么时在套接字对象上设置该属性,然后您可以为断开连接执行此操作:
socket.on('disconnect', function()
console.log('bye ' + socket.user_name);
);
或者,如果用户名在 cookie 中,您可以随时通过解析 socket.handshake.headers.cookie
获取该 cookie 值。
【讨论】:
以上是关于socket io:如何传递参数来断开套接字事件?的主要内容,如果未能解决你的问题,请参考以下文章