Socket.IO - 命名空间
Socket.IO 允许您 "namespace" 套接字,这本质上意味着分配不同的端点或路径。 这是一个有用的功能,可以最大限度地减少资源(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('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 构造函数调用,以在客户端创建连接和套接字对象。
例如,要连接到上述命名空间,请使用以下 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>
每次有人连接到此名称空间时,他们都会收到显示消息 "Hello everyone!" 的 'hi' 事件。