Posted on

Socket.io介紹

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下監聽連接事件也是會進入的。

相關資源