socketIO 命名空间 机制

在 Socket.IO 中,命名空间(namespace)是用来将不同类型的消息隔离开来,以便于不同类型的消息处理逻辑能够更好地管理和维护。

在 Socket.IO 中,每个命名空间都是一个独立的实例,拥有自己的事件和房间(room),它们之间互相独立,不会相互影响。命名空间的使用方法如下:

通过 io.of(namespace) 方法创建命名空间实例,其中 namespace 是一个字符串类型的参数,表示命名空间的名称。如果不传入参数,则默认创建根命名空间 / 的实例。
使用 on 方法监听命名空间中的事件,例如:

const io = require('socket.io')(); // 创建 Socket.IO 服务器实例
const nsp = io.of('/my-namespace'); // 创建名为 my-namespace 的命名空间实例

nsp.on('connection', (socket) => {
  console.log('A client connected to my-namespace!');
});

发送和接收消息:使用 socket.emit 和 socket.on 方法进行发送和接收消息。在命名空间中发送消息时,需要使用命名空间实例 nsp 进行调用。

// 发送消息
nsp.emit('my-event', 'Hello, namespace!');

// 接收消息
nsp.on('my-event', (data) => {
  console.log('Received message in my-namespace:', data);
});

使用房间(room):在命名空间中使用房间和在全局中使用房间的方式相同,只需要在命名空间实例 nsp 上调用 socket.join(room) 和 socket.leave(room) 方法即可。

nsp.on('connection', (socket) => {
  socket.join('my-room'); // 将当前客户端加入到名为 my-room 的房间中

  nsp.to('my-room').emit('my-event', 'Hello, room!'); // 在 my-room 房间中广播消息
});

使用命名空间可以让不同类型的消息得到更好的管理和维护,还可以通过命名空间的划分来进行权限管理、防止消息泄漏等操作。

const count2 = io.of("/").sockets.size;