即使在他们断开 nodeJS socket.io 之后也记住一个客户
Posted
技术标签:
【中文标题】即使在他们断开 nodeJS socket.io 之后也记住一个客户【英文标题】:Remembering a client even after they disconnect nodeJS socket.io 【发布时间】:2021-08-30 12:32:03 【问题描述】:我有一个聊天应用程序,目前,客户端将其名称保存在一个文本文件中,这在 windows 上工作得很好,但 mac 有一些奇怪的目录设置,所以它使读取文本文件变得更加困难。我想知道当客户端连接我的服务器时是否有可能保存他们的 IP 或关于客户端的某种常量数据,所以当客户端再次连接时,我可以知道它是谁并相应地分配名称。
我正在使用 nodeJS socket.io
【问题讨论】:
【参考方案1】:首先想到的是让客户端负责在连接后通过向服务器发送生成的 UUID 来识别自己
socket.on("connect", () =>
const CLIENT_UUID = 'uuid';
// Get client UUID from local storage
let clientUuid = localStorage.getItem(CLIENT_UUID);
// Check whether if this is a new client and it doesn't have UUID
if (!clientUuid)
// Then generate random UUID, you'll need to implement `generateRandomUuid`
clientUuid = generateRandomUuid();
// Then save it to local storage
localStorage.setItem(CLIENT_UUID, clientUuid);
// Then just emit the connected event
// This will be the actual connection event as once this is emitted and received
socket.emit('connected',
uuid: clientUuid
);
);
现在在服务器上你可以根据它的 UUID 处理客户端
io.on('connection', (socket) =>
// Here you handle the `connected` event
socket.on('connected', (clientUuid) =>
// And now you can handle this clientUuid
const chats = getCurrentClientChats(clientUuid);
const groups = getCurrentClientGroups(clientUuid);
socket.emit('current-chats', chats );
socket.emit('current-groups', groups );
);
);
请注意,您的客户现在实际上是在 connected
事件中知道的
同样的方法但可能更简洁的是在连接到服务器时发送客户端 UUID,因为使用套接字 IO 很容易做到这一点
const socket = io("ws://example.com/my-namespace",
query: clientUuid
);
在连接时使用它
io.on('connection', (socket) =>
const clientUuid = socket.handshake.query.name;
const chats = getCurrentClientChats(clientUuid);
const groups = getCurrentClientGroups(clientUuid);
socket.emit('current-chats', chats );
socket.emit('current-groups', groups );
);
【讨论】:
是的,我也想到了这个,我应该更具体一点,我用 nodeJS 托管服务器,但客户端是 python。而且我不想将任何内容保存在文本文件中。不过感谢您的回答。 但是您不必在任何地方保存任何内容,因为所有内容都将保存在内存中(在第二种方法的情况下),而在第一种方法中,您将保存的唯一内容将是位于所有浏览器中的本地存储中以上是关于即使在他们断开 nodeJS socket.io 之后也记住一个客户的主要内容,如果未能解决你的问题,请参考以下文章
如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?