在上一篇博文Socket.IO中,我簡要介紹了Socket.IO的基本使用方法並創建了一個簡單的聊天室DEMO。本篇在入門篇的基礎上,繼續探討Socket.IO的進階用法。本篇將從配置、房間、事件等方面入手,介紹一些Socket.IO中實用的API和注意事項。
1. 配置
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的不同配置:
io.configure('development', function(){
io.enable('browser client etag');
io.set('log level', 1);
});
io.configure('release', function(){
io.set('transports', ['websocket']);
});
以下列舉一些常用的配置項,具體配置參數請參考官方WIKI
1).transports(預設['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']):一個包含通訊方法類型的陣列。 Socket.IO支援多種實現線上即時通訊的方式,如websocket、polling等等,該配置能讓你自行選擇備用的通訊方式。
2).log level(預設3):日誌輸出的最低級別,0為error,1為warn,2為info,3為debug,預設即輸出所有類型的日誌。
3).heartbeat interval(預設25秒):心跳包發送間隔,客戶端需要在此時間段之內向伺服器發送一個心跳包才能保持通訊。
2. 房間
房間是Socket.IO提供的一個非常好用的功能。房間相當於為指定的一些客戶端提供了一個命名空間,所有在房間裡的廣播和通訊都不會影響房間以外的客戶端。
在入門篇中,我們知道socket.join('room name')可用於客戶端進入房間,socket.leave('room name')用於離開房間。當客戶端進入一個房間之後,可以透過以下兩種方式在房間裡廣播訊息:
//2. 向another room廣播一個事件,在此房間所有客戶端都會收到訊息
//注意:和上面對比,這裡是從伺服器的角度來提交事件
io.sockets.in('another room').emit('event_name', data);
//向所有客戶端廣播
io.sockets.emit('event_name', data);
除了向房間廣播訊息之外,還可以透過以下API來取得房間的資訊。
//取得particular room中的客戶端,傳回所有在此房間的socket實例
io.sockets.clients('particular room')
//透過socket.id來取得此socket進入的房間資訊
io.sockets.manager.roomClients[socket.id]
3. 事件
Socket.IO內建了一些預設事件,我們在設計事件的時候應該避開預設的事件名稱,並靈活運用這些預設事件。
伺服器端事件:
1).io.sockets.on('connection', function(socket) {}):socket連接成功之後觸發,用於初始化
socket.on('message', function(message, callback) {}):客戶端透過socket.send傳送訊息時觸發此事件,message為傳送的訊息,callback是收到訊息後要執行的回呼
2).socket.on('anything', function(data) {}):收到任何事件時觸發
3).socket.on('disconnect', function() {}):socket失去連線時觸發(包括關閉瀏覽器,主動斷開,掉線等任何斷開連線的情況)
客戶端事件:
1).connect:連線成功
2).connecting:正在連線
3).disconnect:斷開連接
4).connect_failed:連線失敗
5).error:錯誤發生,並且無法被其他事件類型所處理
6).message:同伺服器端message事件
7).anything:同伺服器端anything事件
8).reconnect_failed:重連失敗
9).reconnect:成功重連
10).reconnecting:正在重連
在這裡要提下客戶端socket啟動連線時的順序。當第一次連接時,事件觸發順序為:connecting->connect;當失去連接時,事件觸發順序為:disconnect->reconnecting(可能進行多次)->connecting->reconnect->connect。
4. 授權
1).向所有客戶端廣播:socket.broadcast.emit('broadcast message');
2).進入一個房間(非常好用!相當於一個命名空間,可以對一個特定的房間廣播而不影響在其他房間或不在房間的客戶端):socket.join('your room name' );
3).向一個房間廣播訊息(發送者收不到訊息):socket.broadcast.to('your room name').emit('broadcast room message');
4).向一個房間廣播訊息(包括發送者都能收到訊息)(這個API屬於io.sockets):io.sockets.in('another room name').emit('broadcast room message' );
5).強制使用WebSocket通訊:(客戶端)socket.send('hi'),(伺服器)用socket.on('message', function(data){})來接收。
Socket.IO的進階用法介紹基本上就到這裡。個人覺得在日常使用的時候這些基本API已經夠用了,這也反映了Socket.IO極為簡潔易用的設計哲學。本文只是拋磚引玉,當實際運用上遇到解決不了的問題時,再去查看官方詳細的WIKI會比較好。