探索 WebSocket

Home PDF

這篇博文是由 ChatGPT-4o 協助整理的。


介紹

大家好,我是李智維。作為CodeReview平台的創始人兼CTO,以及前LeanCloud工程師,我在WebSocket方面有豐富的經驗,尤其是在IM SDK的開發過程中。

WebSocket的重要性

WebSocket是一種在單一TCP連接上提供全雙工通信信道的協議。它被廣泛應用於需要實時交互的現代應用中,如即時通訊、實時評論、多玩家遊戲、協作編輯和實時股票價格。

WebSocket的現代應用

WebSocket廣泛應用於以下領域:

WebSocket的演變

輪詢: 客戶端頻繁請求服務器獲取更新。 長輪詢: 服務器保持請求打開,直到有新信息可用。 HTTP雙向連接: 需要多個連接進行發送和接收,並且每個請求都包含HTTP頭。 單一TCP連接(WebSocket): 克服了HTTP雙向連接的局限性,提供了更高的實時能力和更低的延遲。

在iOS上實現WebSocket

流行的iOS WebSocket庫:

使用SRWebSocket

  1. 初始化和連接:
    SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://echo.websocket.org"]]];
    webSocket.delegate = self;
    [webSocket open];
    
  2. 發送消息:
    [webSocket send:@"Hello, World!"];
    
  3. 接收消息: 實現SRWebSocketDelegate方法來處理傳入的消息和事件。

  4. 錯誤處理和事件通知: 適當處理錯誤並通知用戶連接問題。

詳細的WebSocket協議解釋

WebSocket運行在TCP之上,並引入了幾個增強功能:

WebSocket協議核心

1. 握手: WebSocket握手使用HTTP升級機制:

2. 數據傳輸: WebSocket幀可以包含UTF-8文本、二進制數據和控制幀,如關閉、ping和pong。

3. 安全: 瀏覽器自動添加Origin頭,這無法被其他客戶端偽造。

WebSocket URI

WebSocket幀協議

幀結構:

遮罩鍵: 用於通過遮罩客戶端的幀來防止中間人攻擊。

關閉握手

關閉幀:

示例

示例1:單幀未遮罩文本消息

0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f

包含“Hello”

示例2:單幀遮罩文本消息

0x81 0x85 0x37 0xfa 0x21 0x3d 0x7f 0x9f 0x4d 0x51 0x58

包含“Hello”,帶遮罩鍵

示例3:分片未遮罩文本消息

0x01 0x03 0x48 0x65 0x6c
0x80 0x02 0x6c 0x6f

分片包含“Hel”和“lo”兩幀

高級主題

遮罩和解遮罩:

分片:

控制幀:

擴展性

擴展數據可以放在消息體的應用數據前:

發送:

關閉握手:

關閉連接:

參考資料

致謝

感謝大家的關注。如果有更多問題或討論,歡迎在GitHub或微博上與我交流。


Back 2025.01.18 Donate