2015-05-20 72 views
11

我最近加入了一個新項目,我負責使用web套接字實現流數據。這個想法是目前通過HTTP請求(以RESTful方式)公開的一組信息,他們希望通過Web套接字進行公開。開始理解web套接字和http請求(和STOMP)

我在約網站插座和STOMP過去48小時內做了一大堆的研究,並希望得到幾點澄清:

  1. 因此,對於客戶端,並通過連接服務器web套接字而不是通過HTTP請求/響應,他們首先需要同意在它們之間建立一個Web套接字連接。這是通過HTTP GET完成的,通過一個唯一的頭部來表示他們將使用Web套接字連接來代替?

  2. 理論上說,有一大堆不同的數據通過一些API暴露給瀏覽器。想象一下,有很多不同的HTTP請求可以做成GET,POST,DELETE。因此,爲了讓所有這些信息的某些部分通過Web套接字進行流式傳輸,只需簡單地更改每個資源的當前GET請求,以檢查該特殊WebSocket標頭是否存在,然後執行某些操作?或者還有其他的事情需要通過網絡套接字來暴露某些數據。如果您從HTTP請求初始化套接字,我可能會誤解HTTP和套接字的關係。

我認爲這些是我的兩個主要問題,我相信這些答案將指向我繼續學習更多關於該主題的正確方向。我試圖找到任何好的示例代碼示例,但我試圖理解這一點,以便在本週內實施。

+0

如果您希望實際實現WebSocket通信,那麼您一定要閱讀規範:https://tools.ietf.org/html/rfc6455。我相信你已經看到它,但只是想確保。 – Randy

+1

如果你只是需要使用websocket通信(不需要實現規範),那麼有很多庫將封裝你所有的辛苦工作。 Socket.io可能是更好的Node.js庫之一,因爲它在瀏覽器不支持Web套接字的情況下使用後備。 – Randy

+0

檢查這篇文章:https://blog.pusher.com/websockets-from-scratch – niba

回答

9

因此,對於客戶端和服務器通過Web套接字而不是通過HTTP請求/響應進行連接,他們首先需要同意在它們之間建立Web套接字連接。這是通過HTTP GET完成的,通過一個唯一的頭部來表示他們將使用Web套接字連接來代替?

是的,或多或少。標頭是:

Connection: Upgrade 
Upgrade: websocket 
Sec-WebSocket-Key: <random string, base64 encoded> 
Sec-WebSocket-Version: <version> 

通常version是13這些天,但我相信8也一直沿用至今。

如果服務器同意WebSocket的,它將返回HTTP代碼101以下標題:

Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: <base64 encoded hash based on Sec-WebSocket-Key> 

理論上說是有不同的數據一大堆通過一些API來暴露瀏覽器。想象一下,有很多不同的HTTP請求可以做成GET,POST,DELETE。因此,爲了讓所有這些信息的某些部分通過Web套接字進行流式傳輸,只需簡單地更改每個資源的當前GET請求,以檢查該特殊WebSocket標頭是否存在,然後執行某些操作?或者還有其他的事情需要通過網絡套接字來暴露某些數據。如果您從HTTP請求初始化套接字,我可能會誤解HTTP和套接字的關係。

這聽起來像你明白這一點,但我會指出,你只能用GET來啓動WebSocket。

從你描述的是什麼,目前尚不清楚的是WebSockets的實際上是你想要什麼。 WebSockets用於服務器和客戶端之間的雙向通信。如果您只是希望能夠從服務器流到客戶端,那麼使用Server-Sent Events可以讓您輕鬆得多。

+0

故事的要求傾向於服務器發送事件的Web套接字。所以在這個「握手」發生之後,不再需要發送http請求了?他們剛剛收到101,活飼料開始了嗎? – user3037172

+0

@ user3037172是的。但是,請注意,如果連接斷開,您必須手動重新連接並處理在您離開時錯過的消息。 –

0

我花了超過48小時,真正讓我解決這個頭。這是來自AJAX的重大變化。

你可能在過低的水平的思考。如果您將消息廣播到多個瀏覽器,則有多個消息隊列系統可以通過websockets進行通信(很多或全部使用STOMP)。

但是,如果你只需要發送私人數據,你可能要停止在STOMP級別(或更低)。這個技術現在還不是很成熟,因爲大多數解決方案都涉及前面提到的消息隊列。 STOMP在理論上應該允許你在每一邊(瀏覽器和服務器)有多個端點來獲取消息(在JavaScript和C#之間以JSON或XML序列化)。如果你不喜歡這種技術,使用WebSockets本身來傳遞消息是相當容易的。在這種情況下,每邊都有一個接收器,並且您傳遞一個簡單的結構,如字符串,其中指定了消息後跟一個逗號,然後將消息本身序列化爲任何適用於您的技術(我更喜歡瀏覽器端的JSON,但XML可以工作)。

祝你好運,並更新你的問題或評論你接受的答案與任何你不是在答案中學到的東西,以便其他人可以從中學習。

UPDATE:有人對.NET的實現的WebSockets的更多信息,請與一些細節,我不知道,也沒有進行調查的時候回答。我的回答並不完整,我沒有時間在賞金到期前正確回答。