2016-08-22 118 views
3

我正在構建一個服務器,並試圖實現websocket協議時,我遇到了一些問題。如何理解客戶端在服務器上發送websocket消息的路由?

正如問題標題所描述的,讓我們假設我已經定義了兩條路線(/ws1,/ws2),它們公開了多個websocket連接。

而在握手的情況下,我可以成功地瞭解握手請求的發送路線。

手頭的主要問題是,當客戶端發送後續websocket消息時,服務器如何理解WebSocket消息發送到哪個端點。

看完這個之後:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers我知道消息中沒有表示路線的字段。

以防萬一:我在PHP中這樣做。

+3

websocket就像一個管道。一旦在2點之間握手成功,則建立路線。該請求總是迴應它的出發點。 –

回答

1

使用升級連接的HTTP GET請求建立WebSocket連接。您可以通過使用(int) $resource將資源轉換爲整數來基於PHP中的資源ID標識客戶端。

TCP連接通常由源IP /源端口/目標IP /目標端口四重來標識。

您必須將URI /端點信息保存在數組或類似數據結構中,並將客戶端ID用作索引。然後,您可以在收到新消息時查找終端。

2

握手完成後路由不會改變。這個想法是,WebSocket維護一個全狀態連接,但該連接首先通過HTTP進行協商。這是通過向URI發送正常的HTTP請求完成的,然後終端負責在成功協商後維護連接。

因此,您有責任跟蹤該初始HTTP請求中的信息,在協商WebSocket連接之後,如果您希望隨後使用它。

如果你看一下網頁套接字服務器的一些當前的PHP實現如何做到這一點,例如Ratchet PHP,你會發現它處理WebSocket requests東西收到GuzzleHttp object,之後連接成功協商,在onOpen回調處理程序。這包含與客戶端的連接對象相關的所有原始HTTP請求信息,以便您可以繼續使用它。

所以基本上一個Connection對象包含所有關於sateful TCP套接字本身,再加上HTTP對象,它可以被實現爲像一個GuzzleHttpPSR7 Message對象的信息。每次從該Connection對象收到消息時,耦合的HTTP對象都可以從初始HTTP請求中查找相關的請求行

相關問題