socket.io我应该使用房间或命名空间吗?

时间:2019-02-26 17:44:46

标签: node.js socket.io

我正在使用聊天应用程序,但是我不知道该使用房间还是命名空间以及如何使用它。

我的应用程序大致如下:

运动(频道)

  • Sport_A(子频道)
  • Sport_B(子频道)

政治(渠道)

  • Politics_A(子渠道)
  • Politics_B(子渠道)
  • Politics_C(子渠道)

等...

我的要求:

非身份验证用户只能阅读频道中的消息。 验证用户可以在通道和子通道中读取和写入消息。

非身份验证用户可以同时在多个渠道中(加入和离开)。 Auth用户可以同时在多个渠道和子渠道中(加入和离开)。 那是

这有点复杂,因此我不知道应该在哪里使用房间,在哪里使用命名空间以及如何处理身份验证。

现在我有一个默认的命名空间'/',通道和子通道是房间,但是在哪里执行身份验证以不阻止非身份验证用户?

io.use((socket, next) => {
  if (socket.handshake.query && socket.handshake.query.token) {
    jwt.verify(socket.handshake.query.token, process.env.JWT_SECRET, (err, decoded) => {
      if (err) return next(new Error('Socket authentication error'));
      socket.decoded = decoded;
      next();
    });
  } else {
    next(new Error('Socket authentication error'));
  }
});

1 个答案:

答案 0 :(得分:0)

基本上namespaces将在需要单独的端点或路径时使用。 从官方文档中,

  

这是一个有用的功能,可最大程度地减少资源数量(TCP   连接),同时将您的关注点分开   通过引入通信渠道之间的分隔来实现应用。

// Server

const sportsIo = io.of('/s');

sportsIo.on('connection', function(socket){
  console.log('someone connected');
});

从本质上讲,这意味着对于每个名称空间,您的客户端(webapp)必须创建一个单独的连接

// Client

const sportsIo = io('/sports');

const politicsIo = io('/politics');

现在,对于每个命名空间,您都可以拥有一个或多个套接字可以加入和退出的rooms(或channels)关联。

// Server

// at some point when you want to braodbast to the channel (room)
sportsIo.to('Sport_A').emit('some event');

// Client

sportsIo.on('connection', function(socket){
  socket.join('Sport_A');
  socket.join('Sport_B');
});

有关更多信息,请参考https://socket.io/docs/rooms-and-namespaces/