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
事件。