Socket.IO允许您“命名”套接字,这实质上意味着分配不同的端点或路径。这是一个有用的特性,可以最大限度地减少资源(TCP连接)的数量,同时通过在通信信道之间引入分离来分离应用程序中的关注点。多个名称空间实际上共享同一个WebSockets连接,从而节省了服务器上的用户套接字端口。

名称空间是在服务器端创建的。但是,客户端通过向服务器发送请求来加入它们。

默认命名空间

根命名空间“/”是默认命名空间,如果客户端在连接到服务器时未指定命名空间,客户端将加入该命名空间。使用套接字对象客户端到服务器的所有连接都是默认的命名空间。例如

var socket = io();

这将客户端连接到默认命名空间。此命名空间连接上的所有事件将由服务器上的io object处理。前面所有的例子都是利用默认的名称空间与服务器来回通信。

自定义命名空间

我们可以创建自己的自定义命名空间。要设置自定义命名空间,我们可以在服务器端调用“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 constructor call,以便在客户端创建连接和套接字对象。

例如,要连接到上面的命名空间,请使用以下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”事件。