📜  当 2 次在同一个聊天室中发出时,只有一个正在使用 socket.io - TypeScript (1)

📅  最后修改于: 2023-12-03 15:09:50.529000             🧑  作者: Mango

当 2 次在同一个聊天室中发出时,只有一个正在使用 socket.io - TypeScript

在使用 socket.io 和 TypeScript 构建聊天室时,可能会遇到多个用户同时加入同一个房间的情况。如果这两个用户同时发出了相同的事件,就会导致一个用户的事件被另一个用户的事件覆盖。这篇文章将介绍如何解决这个问题。

问题原因

问题的根源在于 socket.io 的事件监听器是共享的。当多个用户同时加入同一个房间时,它们会共享同一个事件监听器。因此,如果两个用户同时发送相同的事件,只有一个用户的事件会触发监听器。另一个用户的事件将被覆盖。

解决方案

为了解决这个问题,我们需要为每个用户分别创建一个事件监听器。我们可以使用 TypeScript 的类和对象来实现这一点。

首先,我们需要创建一个包含事件监听器方法的类。这些方法将在每个用户连接到服务器时被调用。

class ChatRoom {
  public joinRoom(socket: SocketIO.Socket): void {
    socket.on('message', this.onMessage.bind(this));
    socket.on('disconnect', this.onDisconnect.bind(this));
  }

  private onMessage(message: string): void {
    // handle message
  }

  private onDisconnect(): void {
    // handle disconnect
  }
}

接下来,我们需要在服务器上创建一个实例化聊天室类的方法:

const chatRoom = new ChatRoom();
io.on('connection', (socket: SocketIO.Socket) => {
  chatRoom.joinRoom(socket);
});

现在,每当一个用户连接到服务器时,我们都会为该用户创建一个新的事件监听器。这样,就可以确保每个用户发送的事件都会被正确地处理。

结论

在使用 socket.io 和 TypeScript 构建聊天室时,如果你遇到了多个用户同时加入同一个房间的问题,那么你可以使用类和对象来为每个用户创建单独的事件监听器。这样,就可以确保每个用户发送的事件都会被正确地处理。