天天看點

Socket.IO 配置、房間、事件

一、配置

Socket.IO提供了4個配置的API:io.configure, io.set, io.enable, io.disable。其中io.set對單項進行設定,io.enable和io.disable用于單項設定布爾型的配置。io.configure可以讓你對不同的生産環境(如devlopment,test等等)配置不同的參數。

以下定義了development和release兩種環境下Socket.IO的不同配置:

var io =require('socket.io').listen(80);
io.set('heartbeat interval', 20);
io.set('heartbeat timeout', 25);
io.configure('production', function () {
    io.enable('browser client etag');
    io.set('log level', 0);
    io.set('transports', ['websocket', 'jsonp-polling', 'xhr-polling', 'htmlfile']);
});

io.configure('development', function () {
    io.set('transports', ['websocket', 'jsonp-polling', 'xhr-polling', 'htmlfile']);
});
           

常用配置:

transports(預設['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']):一個包含通信方法類型的數組。Socket.IO支援多種實作線上即時通信的方式,如websocket、polling等等,該配置能讓你自行選擇備用的通信方式。

log level(預設3):日志輸出的最低級别,0為error,1為warn,2為info,3為debug,預設即輸出所有類型的日志。

heartbeat interval(預設25秒):心跳包發送間隔,用戶端需要在此時間段之内向伺服器發送一個心跳包才能保持通信。

二、房間

房間是Socket.IO提供的一個非常好用的功能。房間相當于為指定的一些用戶端提供了一個命名空間,所有在房間裡的廣播和通信都不會影響到房間以外的用戶端。

socket.join('room name')可用于用戶端進入房間,socket.leave('room name')用于離開房間。當用戶端進入一個房間之後,可以通過以下兩種方式在房間裡廣播消息:

//1. 向my room廣播一個事件,送出者會被排除在外(即不會收到消息)
io.sockets.on('connection',function(socket){//注意:和下面對比,這裡是從用戶端的角度來送出事件
socket.broadcast.to('my room').emit('event_name', data);}//2. 向another room廣播一個事件,在此房間所有用戶端都會收到消息//注意:和上面對比,這裡是從伺服器的角度來送出事件
io.sockets.in('another room').emit('event_name', data);//向所有用戶端廣播
io.sockets.emit('event_name', data);
           

除了向房間廣播消息之外,還可以通過以下API來擷取房間的資訊。

//擷取所有房間的資訊//key為房間名,value為房間名對應的socket ID數組

io.sockets.manager.rooms

//擷取particular room中的用戶端,傳回所有在此房間的socket執行個體

io.sockets.clients('particular room')//通過socket.id來擷取此socket進入的房間資訊

三、事件

Socket.IO内置了一些預設事件,我們在設計事件的時候應該避開預設的事件名稱,并靈活運用這些預設事件。

伺服器端事件:

io.sockets.on('connection', function(socket) {}):socket連接配接成功之後觸發,用于初始化

socket.on('message', function(message, callback) {}):用戶端通過socket.send來傳送消息時觸發此事件,message為傳輸的消息,callback是收到消息後要執行的回調

socket.on('anything', function(data) {}):收到任何事件時觸發

socket.on('disconnect', function() {}):socket失去連接配接時觸發(包括關閉浏覽器,主動斷開,掉線等任何斷開連接配接的情況)

用戶端事件:

connect:連接配接成功

connecting:正在連接配接

disconnect:斷開連接配接

connect_failed:連接配接失敗

error:錯誤發生,并且無法被其他事件類型所處理

message:同伺服器端message事件

anything:同伺服器端anything事件

reconnect_failed:重連失敗

reconnect:成功重連

reconnecting:正在重連

在這裡要提下用戶端socket發起連接配接時的順序。當第一次連接配接時,事件觸發順序為:connecting->connect;當失去連接配接時,事件觸發順序為:disconnect->reconnecting(可能進行多次)->connecting->reconnect->connect。