2014-10-16 136 views
1

Websocket?還是XMLHttpRequest?或者我必須自己做?誰在發送http websocket升級請求?

所以我明白客戶端必須發送它,但是何時以及爲什麼?假設我使用XMLHttpRequest對象來發送一個正常的HTTP GET。 我無法控制瀏覽器內部tcp連接持續的時間,對嗎? 如果我想使用websockets,我必須使用自己的websocket類,所以對於我作爲用戶來說,「升級」是不可見的,是嗎? 這只是瀏覽器正在做一些內部魔術來重用連接,整個升級過程對我來說是不相關的用戶?我仍然需要使用兩個不同的類,我只是碰巧使用同一個端口,然後瀏覽器決定升級性能的原因。 這真的是對的嗎?

回答

2

不,WebSocket客戶端發送HTTP請求請求WebSocket連接,然後服務器以HTTP 101交換協議響應,這意味着它接受連接,然後客戶端可以開始以二進制方式發送和接收數據格式。

實施例的客戶機請求:

GET /chat HTTP/1.1 
Host: server.example.com 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 13 
Origin: http://example.com 

實施例的服務器響應:http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake

,它是在該規範中詳述:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 
Sec-WebSocket-Protocol: chat 

據維基百科文章中很好地解釋https://tools.ietf.org/html/rfc6455#section-1.3

這只是瀏覽器正在做一些內部魔術來重用連接,整個升級過程對我來說是不相關的用戶?

這是正確的。

我還是要使用兩個不同的類,我只是碰巧使用了 相同的端口,然後在瀏覽器決定出於性能的考慮到 升級。這真的是對的嗎?

如果您想使用AJAX,請使用XMLHttpRequest。如果你想使用WebSocket,你可以使用WebSocket類。不過,它們可以通過同一個端口訪問。不同之處在於WebSocket連接將與服務器協商一個全雙工持久二進制通道,而XMLHttpRequest只會提出請求並獲得響應。

+0

哦好吧,所以每個WebSocket類如果想要發送二進制數據就發送一個Http請求。所以假設我發送一個http get,然後打開一個websocket,然後發送一個普通的http get ...然後瀏覽器必須打開一個新的客戶端套接字,因爲舊的已經轉換爲websocket,並且我認爲它保持這種方式永遠現在,並且該套接字上的服務器端不需要能夠處理http請求? – Blub 2014-10-16 12:07:51

+0

對。每個WS連接始終作爲HTTP請求啓動。一旦WS協商通過HTTP完成,連接就不會關閉,它會一直保持開放狀態,使用二進制框架進行消息傳遞,直到它關閉,在該通道中不再允許HTTP。這種HTTP協商機制非常有用,因爲它允許遍歷安全檢查器,並且不需要在路由器和防火牆中映射和/或打開其他TCP端口;它也允許交換cookie,所以它很好地集成到了網絡應用程序中。 – vtortola 2014-10-16 12:12:07