Comet Exchange Server 封包協定說明(未完成)
版本 : 0.1
日期 : XXXX-XX-XX
作者 : Pigo Chu
索引
- 簡介
- 訊息交換過程
- 主要封包格式
-
各種封包說明
-
Session 封包
- SessionStart
- SessionRestart
- SessionStatus
- SessionStop
-
Group 說明
- GroupCreate
- GroupCreateStatus
- GroupClose
- GroupCloseStatus
- GroupJoin
- GroupJoinStatus
- GroupLeave
- GroupLeaveStatus
- Send 說明
- Receive 說明
- Event 說明
-
Session 封包
1. 簡介
Comet Exchange Server(簡稱 CxServer)主要用途是提供給 Web Server 的 Client 進行即時訊息交換的服務 , 目前規劃主要功能如下
- 可以讓 client 之間 1 對 1 互傳訊息
- 具備群組功能 , 可讓 client 對群組的所有成員發送訊息 , 類似 Multicast
- 具備廣播功能 , 可發送訊息給所有 client
- 應用方面不限制開發的程式語言
由於要讓 Client 之間可以互相交換訊息 , 因而有了 Comet Exchange Server 封包協定(簡稱 CxPacket) , 除了 CxServer 是採用 C# 開發 , 任何想要透過 CxServer 達成訊息交換的程式設計師只要針對 CxPacket 協定去實作即可 , 因此任何程式語言皆可開發 , 而目前已經有 PHP 版本的 CxClient , 方便愛好 PHP 的人使用
2. 訊息交換過程
以 Comet Exchange Server 實作 Comet 應用可以區分為三塊 , Browser 及 CGI (如 PHP / ASP.NET) 及CxServer , CGI 程式來處理邏輯 , CxServer 僅供資料交換用途 , 而 CGI 程式是介於 Browser 及 CxServer 之間的橋樑 , 當 Browser 連線到 Web Server 時 , 此時 CGI 程式接手控制權 , 並且在不斷線的狀況下 , 持續將 CxServer 送來的資料傳遞給 Browser
但因為 Browser 特性 , 在不斷線持續接收資料的情況下將會一直耗用記憶體 , 因此在傳遞資料到一定時間或數量的時候 , 必須讓 CGI 與 Browser 斷線 , 然後 Browser 端再次與 Web Server 連線 , 繼續收資料
但在應用上 , Browser 若與 Web Server 斷線後重新連線 , 這樣勢必會有某些資料在傳遞過程中遺失 , 試想 , 當 A 送一則聊天對話給 B , B 斷線正在重連怎麼辦 ?
因此 CxServer 有實作出 Session 的機制 , 任何想要透過 CxServer 作資料交換的連線 , 都會配發一組 Session Key , 而 CxServer 會知道該 Session 的連線是否中斷 , 若中斷 , 其他 Session 的 Client 仍可以傳遞資料給已經中斷的 Session , 等已經中斷的 Session Client 再度連線時 , CxServer 會將該 Session 所緩存的資料再度送出 , 當然 Session 有存活期 , 如果設定 Session 存活期為 5 秒 , 若已經中斷的 Session Client 在 5 秒內沒有再度連線 , 那麼該 Session 將消失 , 下圖為訊息交換的示意圖
圖中的男士發送一個 Hello 的訊息 , 經過 Web Server 收到之後轉換成 CxPacket_Send 封包 , 再將封包送給 CxServer 處理 , CxServer 得知此封包的用意是要將資料傳送到某個 Client , 因此會轉換為 CxPacket_Receive 封包丟給 Web Server , 而此時女士在 Server 上的 CGI 程序會收到 CxPacket_Receive 封包 , 因此又將其轉換為 Browser 端可以使用的格式(例如 javascript) , 而此時女士的瀏覽器在不斷線的情形下就會從瀏覽器看到男士說了個 Hello 啦 !
3. 主要封包格式
CxServer 透過很多的 CxPacket 封包來達成資料交換的目的 , 但每種 CxPacket 封包都有共通性 , 下表是所有封包的共同特性
名稱 | 類型 | 說明 |
---|---|---|
PacketStart | byte | 封包開始 , 永遠為 0xfe 的值 |
PacketLength | Int16 | 封包長度 |
PacketType | Int16 | 封包類型 |
PacketContent | 封包內容 | |
PacketStop | byte | 封包結束 , 永遠為 0xff 的值 |
我們舉一個 CxPacket 的 SessionStatus 封包來看就知道了
名稱 | 類型 | 值 | 說明 |
---|---|---|---|
PacketStart | byte | 0xfe | |
PacketLength | Int16 | ||
PacketType | Int16 | 0x0102 | |
Status | byte | 1 或 0 | 代表 Session 狀態 |
SessionKey | byte[32] | 字串 | 32 bytes MD5 字串 |
PacketStop | byte | 0xff |
以 SessionStatus 的封包內容來看 , Status 及 SessionKey 就是 PacketContent 的部分了