WebSocket 區分不同的客戶端主要依靠每個連線建立時分配的唯一 連線識別符號 (Connection ID)。 伺服器端會為每個新建立的 WebSocket 連線生成一個獨一無二的 ID,並將其與該連線的客戶端相關聯。 後續所有來自該客戶端的訊息和伺服器向該客戶端傳送的訊息都會透過這個 ID 進行識別和路由。
可以理解為每個客戶端連線到伺服器後,都獲得了一個專屬的“房間鑰匙”,伺服器透過這個“鑰匙”就能找到對應的“房間”(客戶端連線),從而實現點對點通訊。
雖然 WebSocket 協議本身並沒有規定 Connection ID 的具體格式和生成方式,但通常由伺服器端自行實現。 常見的實現方式包括:
- GUID (Globally Unique Identifier): 使用 GUID 生成全域性唯一的 ID,可以確保 ID 的唯一性,即使在分散式環境下也是如此。
- 自增計數器: 伺服器維護一個計數器,每當有新的連線建立時,計數器加一,並將當前值作為 Connection ID。 這種方式實現簡單,但在分散式環境下需要額外的同步機制。
- 結合其他資訊: 將一些客戶端資訊(例如 IP 地址、埠號、時間戳等)組合起來生成 ID。
除了 Connection ID 之外,還可以結合以下機制來進一步區分和管理客戶端:
- 子協議 (Subprotocols): 客戶端在建立連線時可以指定一個或多個子協議,伺服器可以選擇支援其中一個。 這可以用來區分使用不同協議或不同版本協議的客戶端。
- 自定義頭部資訊: 客戶端可以在連線請求中新增自定義頭部資訊,伺服器可以根據這些資訊來區分客戶端。
- 應用層邏輯: 在應用層,開發者可以根據業務需求,例如使用者登入資訊(使用者名稱、使用者ID 等),來區分和管理不同的客戶端。 這通常是更常用的方式,因為 Connection ID 對於應用層來說往往是透明的。
總而言之,WebSocket 主要透過伺服器生成的唯一 Connection ID 來區分不同的客戶端,並結合其他機制在應用層進行更精細的管理。 前端開發者通常不需要直接處理 Connection ID,而是透過應用層的邏輯(例如使用者認證和授權)來識別和管理不同的使用者連線。