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:如何传递参数来断开套接字事件?的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 断开事件和相关闭包的垃圾收集

如何从 socket.io 获取原生事件数组?

如何使用 socket.io 断开所有套接字服务端?

socket.io 服务器在注册客户端断开连接时非常延迟

刷新时Socket.io断开连接?

如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?