我使用了socket.on
和io.emit
方法,并且得到了所有用户的回应。但是,我想得到特定用户的回复。
但是我的应用程序包含登录功能,我在stackoverflow上关注了this个帖子,他们说我们需要在对象中使用唯一的userId
和socketId
特定用户为特定用户发出事件。
但是我在登录后得到了userId ,但是当用户连接到应用程序时我们想要它。
那么有人可以帮我吗?
答案 0 :(得分:1)
在您的node.js中,创建一个全局数组'aryUser',每个元素都包含socketid和loginid。
node.js onConnect(新连接),使用套接字id将新元素添加到数组中,并设置loginid = empty。
用户登录后,从客户端向服务器发出事件,例如:
socket.emit('userloginok',loginid)
socket.on('userloginok',loginid)
,然后在此函数中,用socketid搜索aryUser,并将数组元素中的空loginid替换为parm loginid。
socket.on('disconnect')
在此功能中,搜索aryUser,使用aryUser.splice(i,1)删除刚刚断开连接的用户。
意味着aryUser包含所有已连接的用户,其中一些已登录,其中一些未登录。而且,您可以使用数组的套接字ID向特定用户和/或所有用户发送消息。
示例源代码:
http://www.zephan.top/server.js
http://www.zephan.top/server.html.txt
将server.html.txt重命名为server.html,将server.html和server.js放在同一目录中,然后运行:
节点server.js
答案 1 :(得分:0)
是的,您肯定需要socketId
才能在两个特定用户之间发送和接收消息。
UserId
仅用于跟踪与特定用户相关的socketId
,或者您也可以通过其他方式来管理它。
根据您的问题,您有userId
位用户,而您需要socketId
位用户!因此,在这种情况下,您可以通过userId
将该特定对象从客户端连接到套接字服务器,如下面的代码片段所示,
const socket = io(this.SOCKET_SERVER_BASE_URL, { query: `userId=${userId}` });
您可以像这样在nodejs服务器上读取该用户,
const userId= socket.request._query['userId'],
const socketId= socket.id
现在将此socketId
存储在某个地方,例如Redis或由您决定的某种缓存机制,只需确保获取和检索应该很快。
现在,在发送消息时,只需使用下面的代码从缓存中socketId
中拉出socketId
并发送消息,
io.to(socket.id).emit(`message-response`, {
message: 'hello'
});
我在Angular和AngularJs上都写了一篇有关该主题的完整博客文章,您也可以参考这些文章。
编辑1:
第1部分=>
当用户完成登录请求时,然后建立与套接字服务器的连接。
假设您正在使用React或Angular成功登录后,您将把用户重定向到home组件(页面)。在Home组件(页面)上,通过传递userId
来使套接字服务器连接,
const socket = io(SOCKET_SERVER_BASE_URL, { query: `userId=${userId}` });
P.S。您可以从URL获取用户ID,也可以使用适合您的Cookie。
一旦在服务器上收到此套接字连接请求,就可以读取userID
查询,并获得与之关联的socketId并将其存储在这样的缓存中,
io.use( async (socket, next) => {
try {
await addSocketIdInCache({
userId: socket.request._query['userId'],
socketId: socket.id
});
next();
} catch (error) {
// Error
console.error(error);
}
});
第2部分=> 现在,假设您在客户端有一个用户列表,并且想要向特定用户发送消息。
socket.emit(`message`, {
message: 'hello',
userId: userId
});
在服务器端,使用socketId
从缓存中获取UserId
。从缓存中获取socketId后,请发送类似这样的特定消息,
io.to(socketId).emit(`message-response`, {
message: 'hello'
});
希望这会有所帮助。