Socket.IO - 命名空间



Socket.IO 允许你对 socket“命名空间”,实质上意味着分配不同的端点或路径。这是一个有用的功能,可用于最大程度减少资源(TCP 连接)数量,同时通过在通信通道之间引入分离来区分应用程序中的关系。多个命名空间实际上会共享同一个 WebSocket 连接,从而为我们节省了服务器上的 socket 端口。

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

默认命名空间

根命名空间 '/' 是默认命名空间,如果客户端在连接到服务器时未指定命名空间,客户端就会加入该命名空间。使用 socket 对象客户端端连接到服务器的所有连接都是使用默认命名空间进行的。例如 −

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('E:/test/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 构造函数调用**,以在客户端创建连接和 socket 对象。

例如,若要连接到上述命名空间,请使用以下 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' 事件,显示消息 **“大家好!”**。

广告