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' 事件,顯示訊息 **“大家好!”**。

廣告