socket.to(username).emit('eventName',{})如何工作?

时间:2018-07-02 22:28:48

标签: node.js socket.io

有人可以解释socket.to(username).emit('eventName',{})的工作方式吗?基本上,我想知道它如何标识“用户名”是否已登录。

2 个答案:

答案 0 :(得分:0)

首先,它不是用户名,而是可以在以下位置使用的socket.id值或房间名称:

socket.to(roomname).emit(...)

它的工作方式是,给套接字连接到服务器的套接字被赋予一个socket.id值,然后将该值添加到socket.io服务器保留的数据结构中。每当套接字断开连接时,都会从数据结构中删除该socket.id。

所以,当您这样做时:

socket.to(roomname).emit(...)

socket.io在其内部数据结构中查找您传递的房间名称。如果在那里,那么它可以从该数据结构中获取套接字,然后可以发送给它。

因为socket.io还会自动创建一个房间,其名称为每个插座都给定的socket.id,所以您也可以这样做:

socket.to(socketID).emit(...)

并且,使用与上述相同的机制,它将查找一个以socketID命名的房间,并且由于每个连接的套接字都有匹配的空间,因此它将找到该房间,然后将其发送给具有该socketID的套接字。 / p>


socket.io本身没有用户名的任何概念。首次建立socket.io连接时,您必须自己添加该功能级别或从cookie(如果已经有登录cookie)中获取该功能。

答案 1 :(得分:0)

socket.to(room).emit(...)会使用room向所有加入socket.join(room)的用户发送消息。

默认情况下,每个套接字都加入一个由套接字ID标识的房间,这就是为什么,您还可以这样做:socket.to(socketId)


在不知道您的逻辑的情况下,如果username房间没有登录,则该房间将是空的;如果该用户在线,则该房间将具有已登录的用户。 Socket.io并不真正知道用户是否在线,它只知道那个房间里有一个用户。

io.on('connection', (socket) => {
    console.log('New user connected');

    const username = getUsernameSomehow(); // logged user, ip, cookie, or whatever you like

    // When the user is online, it will join to 
    // a room named after his username
    socket.join(username);

    socket.on('send', (message) => {
        console.log(message);
        // Now you can send a message by only knowing the username
        socket.to(message.target).emit('message', message.text);
    });
});

如果您不将用户加入username会议室,则您的代码将永远无法使用。