1. 程式人生 > >Socket.IO API Namespace

Socket.IO API Namespace

名稱空間

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

事件,並將當前的socket例項作為引數傳入回撥函式中

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

在名稱空間中,可以joinleave 任意定義的通道

io.on('connection', function(socket){
  socket.join('some room');
});

通過 toin方法來對特定的通道進行廣播或觸發事件

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' });