Socket.io
socket.io是基於Websocket的Client-Server實時通信庫
Socket.io承繼了Node.js的事件處理方法,把Client端與Server端的程式統一成一至的操作方式,讓使用者可以只需專注在處理「事件」,就可以快速開發出應用,他也支援『房間』的概念,可以使用同一條WebSocket卻擁有不被彼此干擾的資料傳輸(多種聊天頻道的概念)。另外,他也提供了很好的fallback機制,即使用戶的瀏覽器不支援WebSocket,他還是可以利用Flash、XMLHttpRequest等方式來傳送資訊(速度會比較慢就是了)。這些機制都他都包裝好了,所以寫程式時並不需要知道這些細節,只需要設定好就可以運作。
Socket.io 特性整理
- Events 自訂事件。
- Rooms Room 的概念只存在於伺服器端。可以理解為訊息處理時的聽眾分組,可對同一個分組內的聽眾進行廣播。
- Namespaces 命名空間,我理解為底層連線的分組管理,不同命名空間可以走同一條 Engine.io 連線或是各自連線,每個命名空間可以各自驗證是否接受連線。
- ACK 回調 如同 HTTP 之於 TCP,HTTP 為 TCP 提供了一套請求與響應的模型。ACK 也為 Socket.io 提供了一套請求與響應的通訊模型。
- 連線維護
- 自動斷線重連
- ping/pong 心跳
簡單範例
var io = require('socket.io')(80) ; var cfg = require('./ config.json'); var tw = require('node-tweet-stream')(cfg); tw.track('socket.io'); tw.track('javascript'); tw.on('tweet',function(tweet){ io.emit('tweet',tweet) ; });
認識 Socket.io 協議
請參考此篇文章:認識 Socket.io 協議
搭配nginx使用
- 需要添加下面2行配置:proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “Upgrade”; - 如果有多個實例啟動的話,需要保證某個ip連接到某個實例之後,一直保持和該實例的連接,而不是被負載均衡隨機分配實例,還需要配置下面一行:
upstream {
ip_hash; // 主要這行,該行還必須在ip:port之前,否則會有警告出現
ip:port;
ip:port;
….
}
ns
另外需要注意的是,使用socket.io的話,是有替換的名稱空間(/),所以無論客戶端連接的ns是哪一個,都會先進入根ns的,並且會記錄下這個客戶端的。換句話說 ,如果你有2個客戶端連接ns1,3個客戶端連接ns2的話,那麼在/下就會有5個客戶端,並且在根ns下監聽連接事件也是會進入的。