Socket.IO API Namespace
阿新 • • 發佈:2018-12-13
名稱空間
Socket.IO 允許命名套接字
這是一個有用的功能,可以最大限度地減少資源數量(TCP連線),同時通過在通訊通道之間引入分離來分離應用程式中的問題。
預設名稱空間
預設名稱空間為/
,預設情況下是Socket.IO客戶端及伺服器的連線和監聽的名稱空間
以下的方法預設向所有連線到/
的socket傳送訊息
// the following two will emit to all the sockets connected to `/`
io.sockets.emit('hi', 'everyone');
io.emit('hi', 'everyone'); // short form
每個名稱空間都會出發一個connection
io.on('connection', function(socket){
socket.on('disconnect', function(){ });
});
自定義名稱空間
在伺服器端呼叫of
函式:
var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected');
});
nsp.emit('hi', 'everyone!');
在客戶端指定名稱空間:
var socket = io('/my-namespace');
注意:名稱空間是Socket.IO協議的實現細節,與底層傳輸的實際URL無關
Rooms
在名稱空間中,可以join
和leave
任意定義的通道
io.on('connection', function(socket){
socket.join('some room');
});
通過 to
或in
方法來對特定的通道進行廣播或觸發事件
io.to('some room').emit('some event');
Default Room
每一個socket在Socket.IO中,都有一個唯一識別符號Socket#id
。為了便利起見,每個套接字自動加入由此id標識的Room
斷開連線時,socket會自動退出其所在的Room
從外部世界傳送訊息
設定adapter 為socket.io-redis
var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host:'localhost',port:6379 }));
然後利用 socket.io-emitter
,你可以從任何程序向任何通道傳送訊息
var io = require('socket.io-emitter')({ host:'127.0.0.1',port:6379 });
setInterval(function() {
io.emit('時間',新 日期);
},5000);
API
客戶端始終連線到/
主名稱空間,然後潛在的連線到其他名稱空間
namespace.name
獲取名稱空間名稱
namespace.connected
Socket連線到此名稱空間的物件的雜湊值,索引為id
namespace.adapter
用於名稱空間的adapter
,在使用Adapter基於Redis的方法時很有用,因為它公開了管理叢集中套接字和房間的方法。
namespace.to(room) namespace.in
namespace.emit(eventName [,... args])
向所有連線的客戶端傳送事件
namespace.clients(callback)
獲取連線到此名稱空間的客戶端ID列表
namespace.use(fn)
註冊一箇中間件函式,為每一個傳入的socket執行該函式
io.use((socket, next) => {
if (socket.request.headers.cookie) return next();
next(new Error('Authentication error'));
});
Event: connect connection
在客戶端連線時觸發。
io.on('connect',(socket)=> { // ... });
io.of('/admin').on('connect', (socket) => {
// ...
});
Flag: ‘volatile’
如果客戶端未準備好接收訊息,則事件資料可能會丟失
io.volatile.emit('一個事件',{ some:'data' }); //客戶可能會也可能不會收到它
Flag: ‘binary’
制定傳輸的資料是否存在二進位制。指定時提升效率。
io.binary(false).emit('an event', { some: 'data' });
Flag: ‘local’
事件資料將僅廣播到當前節點(使用Redis介面卡時)
io.local.emit('一個事件',{ some:'data' });