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