socket-io:如何将参数传递给disconnet套接字事件

socket io: how to pass paramter to disconnet socket event?

本文关键字:disconnet 套接字 事件 参数传递 socket-io      更新时间:2023-09-26

我正在使用socket-io构建聊天应用程序。

当"用户x"退出聊天时,我想打印到控制台日志:"再见用户x"。

为此,我需要将user_name作为参数传递给disconnect事件。

问题是我不知道如何将数据传递给断开连接事件:

socket.on('disconnect', function(){...})

当用户断开连接时,它会被自动调用。

我想要像一样的东西

socket.on('disconnect', function(user_name){
    console.log('bye '+user_name);
})

但如果这是可能的(是吗?),那么我如何在客户端传递这个参数(我的情况是,角度)?

下面是我完整的socketioserver.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");
    });
});

不能将数据传递给断开连接事件。但是,您可以在较早的时候将自己的属性附加到socket对象,也可以保留带有附加信息的套接字映射。

您只需要确保服务器知道每个套接字的用户名(我无法从您的问题中判断用户名是客户端还是服务器端的数据)。然后,您可以将它作为属性附加到套接字对象。完成此操作后,当您获得断开连接事件时,您可以查看正在断开连接的套接字上的属性。

因此,无论用户名信息来自哪里,当服务器知道它是什么时,您都可以在套接字对象上设置该属性,然后您可以为断开连接执行此操作:

socket.on('disconnect', function(){
    console.log('bye ' + socket.user_name);
});

或者,如果用户名在cookie中,则可以通过解析socket.handshake.headers.cookie随时获取该cookie值。