Socket.IO - 命名空间
Socket.IO 允许你命名 Sockets,这实际上意味着分配不同的端点或路径。这是一个有用的功能,可以最大限度地减少资源数量(TCP 连接),同时通过在通信通道之间引入分离来分离应用程序中的问题。多个名称空间实际上共享相同的 WebSockets 连接,从而在服务器上节省了我们的 Sockets 端口。
命名空间是在服务器端创建的。但是,客户端通过向服务器发送请求来加入它们。
默认命名空间
根命名空间 /
是默认命名空间,如果客户端在连接到服务器时未指定命名空间,则由命名空间连接。使用 Sockets 对象客户端连接到服务器的所有连接都是默认命名空间。例如 -
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 构造函数调用的参数,以在客户端创建和连接 Sockets 对象。
例如,要连接到上面的命名空间,请使用以下 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
事件。