即使在他们断开 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 之后也记住一个客户的主要内容,如果未能解决你的问题,请参考以下文章

nodejs socket 怎么检测客户端主动断开连接

如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?

socket.io:没有触发断开事件

Socket.io 会话管理?

通过 websockets 的 Socket.io - 随机“传输端”断开连接

socket.io 通过 XHR 轮询强制断开连接