有人可以解释socket.to(username).emit('eventName',{})
的工作方式吗?基本上,我想知道它如何标识“用户名”是否已登录。
答案 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
会议室,则您的代码将永远无法使用。