2012-09-11 32 views
2

我使用Java Tomcat作爲websocket服務器。websocket雙向概念如何工作?

我認爲websocket和http流(我不是指輪詢和長輪詢)之間的主要區別是websocket允許雙向通信,它類似於通常的原始套接字編程。 (以上是我的理解,可能是錯誤的,請隨時糾正我。)

我的問題是如何通過已打開的websocket Web客戶端(瀏覽器)繼續發送另一個請求?通常的HTTP請求會把另一個請求當作新的套接字連接,但websocket不會,這就是爲什麼我很困惑,它是如何實現的?它應該在服務器端還是客戶端(瀏覽器)端處理?

回答

4

是的,websockets是雙向的。一個重要的結果是您可以有效地將數據從服務器推送到客戶端。

底層套接字只是保持打開狀態(如果不能保持打開狀態,需要時重新打開)。請注意,HTTP 1.1還有did that

HTTP/1.1是原始HTTP(HTTP/1.0)的修訂版。在HTTP/1.0中,一個 請求的每個資源 都會爲同一臺服務器單獨建立連接。 HTTP/1.1可以多次重複使用連接,以便在頁面已發送 後下載 圖像,腳本,樣式表等。 HTTP/1.1通信因此經歷較少的等待時間 ,因爲建立TCP連接呈現相當大的開銷。

它必須同時處理客戶端和服務器端。當然,這意味着兩個軟件都會更新(old browsers,舊服務器無法處理websockets)。

EDIT(以下在評論交流):

客戶端,這裏有一個連接怎麼能夠被初始化

var ws = new WebSocket('ws://'+document.location.host+'/ws'); 
ws.onopen = function() { 
     // do something 
}; 
ws.onerror = function() { 
     // do something 
}; 
ws.onclose = function() { 
     // do something 
}; 
ws.onmessage = function(msgevent) { 
    var msg = JSON.parse(msgevent.data); 
    // handle incoming message 
}; 

你保持WS變量之後,你可以從客戶端推到服務器使用相同的連接與

ws.send(window.JSON.stringify(msg)); // msg is a basic js object 
+0

所以,它可以允許推送數據從服務器到客戶端,從客戶端到服務器怎麼樣?既然是雙向的,應該允許這樣做嗎? – GMsoF

+1

當然。我提到了從服務器到客戶端的推送,因爲在websocket協議之前,這很難以標準和有效的方式完成。 –

+0

我看到...但客戶端如何將數據推送到服務器?在Java原始套接字編程中,我知道如何實現這一點。但是,對於Web瀏覽器客戶端如何重用相同的套接字? – GMsoF