Socket.IO 命名空间

  • 命名空间

    Socket.IO允许您“命名”套接字,这实际上意味着分配不同的端点或路径。这是一项有用的功能,可通过在通信通道之间引入分隔来最大程度地减少资源(TCP连接)的数量,并同时在应用程序中分隔关注点。多个名称空间实际上共享同一WebSockets连接,从而为我们节省了服务器上的套接字端口。命名空间是在服务器端创建的。但是,客户端通过向服务器发送请求来加入它们。
  • 默认命名空间

    根名称空间“/”是默认名称空间,如果客户端在连接服务器时未指定名称空间,则默认名称空间由客户端加入。使用套接字对象客户端到服务器的所有连接均使用默认名称空间。例如-
    
    var socket = io();
    
    这会将客户端连接到默认命名空间。此名称空间连接上的所有事件将由服务器上的io对象处理。前面的所有示例都利用默认名称空间与服务器进行通信并返回。
  • 自定义命名空间

    我们可以创建自己的自定义名称空间。要设置自定义名称空间,我们可以在服务器端调用'of'函数-
    
    var app = require('express')();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    
    app.get('/', function(req, res) {
       res.sendfile('index.html');
    });
    
    var nsp = io.of('/my-namespace');
    nsp.on('connection', function(socket) {
       console.log('someone connected');
       nsp.emit('hi', 'Hello everyone!');
    });
    
    http.listen(3000, function() {
       console.log('listening on localhost:3000');
    });
    
    现在,要将客户端连接到该名称空间,您需要提供名称空间作为io构造函数调用的参数,以在客户端创建连接和套接字对象。例如,要连接到上述名称空间,请使用以下HTML-
    
    <!DOCTYPE html>
    <html>
       <head>
          <title>Hello world</title>
       </head>
       <script src = "/socket.io/socket.io.js"></script>
       
       <script>
          var socket = io('/my-namespace');
          socket.on('hi',function(data) {
             document.body.innerHTML = '';
             document.write(data);
          });
       </script>
       <body></body>
    </html>
    
    每当有人连接到该命名空间时,他们都会收到一个“hi”事件。