Java WebSocket實現(一)——基礎知識

一、概述

        之前在工作中,遇到了一種情況:服務端數據變更後,需要實時推送到前端頁面,頁面的內容更新。最開始考慮使用輪詢,但消耗很大,最後還是找到了一種後端向前端主動推送數據的方法。其實,WebSocket允許服務端主動向客戶端推送數據,就可以用它來實現,但考慮到項目當時只有一個地方用到,且要求簡單,所以便找了較爲輕便的解決方案。 有不少網站爲了實現數據推送,採用了輪詢。

        目前論詢採用的技術有Comet、dwr等。HTML定義了WebSocket協議,能更好的節省服務器資源和帶寬,且能更實時的進行通訊。

 

二、基礎概念

單工(Simplex Communication)

        指數據的傳輸是單向的。具體來講,在通信雙方中,一方固定爲發送端,另一方爲固定接收端,單工則是通訊時信息只能沿一個方向傳輸。比如從武漢到北京的高速公路,右邊的車道只允許一個方向的車流行駛,從北京到武漢的車,必須走對面的車道。

半雙工(Half Duplex)

        是數據傳輸時,數據可以在一個信號載體上進行兩個方向的傳輸,但不能同時進行。還是說從武漢到北京的高速公路,從武漢到北京需走右邊的車道,若交通規則改成靠左行駛,那從北京到武漢走的也是原來的車道,但這個車道不能讓從武漢到北京的車與從北京到武漢的車同時走,這時就堵住了,誰也動不了。

全雙工(Full Duplex)

        是指通信時允許數據在兩個方向上同時傳輸,它在能力上相當於兩個單工通信方式的結合;可以同時(瞬時)進行信號的雙向傳輸(A——>B且B——>A)。

輪詢

       輪詢是在特定的時間間隔(比如2秒)內,客戶端向服務器發送請求,然後服務器端返回最新數據給客戶端。其缺點是客戶端需要不斷的向服務器發送請求,請求中包含的真正有效的數據可能只有很小的一部分(比如請求頭部可能會較長),浪費帶寬;若間隔時間稍長則會有延時,若太短則請求會非常的頻繁。

長連接

       指數據通訊的雙方在較長的時間內保持連接不斷開,然後在這個連接上可以連續發送多個數據包,在連接保持期間,若沒有數據包發送,需要雙方發鏈路檢測包。由於當連接建立後,不會在很短時間內斷開,下次處理時直接發送數據就可以了,不用再去建立新的連接,所以它穩定安全。但由於長時間保持連接,也會損耗很多資源。長連接多用於操作頻繁、點對點的通訊。

短連接(short connnection)

        短連接是相對於長連接來講的,是指在數據通訊過程中,只在需要發送數據時,纔去建立一個連接,數據發送完成後,就斷開連接,即每次連接只完成一項業務的發送。優點是不需要長期佔用通道,在業務頻率不高的場景下,能節省通道的使用。缺點是需要在每次發送業務時,都建立一個連接,這樣以來連接建立的開銷大。

 

三、WebSocket

3.1 WebSocket介紹        

        WebSocket是HTML5開始提供的一種在單個TCP連接上進行全雙工通訊的協議。它使客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。

        在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就可以直接創建持久性的連接,並進行雙向數據傳輸。爲了創建WebSocket連接,需要通過客戶端(如瀏覽器)發出請求,然後服務器進行迴應,這個過程稱爲“握手”(handshaking)。WebSocket是獨立的、創建在TCP協議上的,通過HTTP/1.1協議的101狀態碼進行握手。 

 

3.2 WebSocket的優點

       WebSocket有以下優點:

較少的控制開銷

        在創建連接後,服務器與客戶端之間交換數據時,用於協議控制的數據包頭部相對較小。在不包含擴展的情況下,對於服務器到客戶端的內容,此頭部大小隻有2到10字節(和數據包長度有關);對客戶端到服務器的內容,此頭部還需要加上額外的4字節的掩碼。相對HTTP請求每次都要攜帶完整的頭部,此項開銷就顯著減少了。

更強的實時性

        由於協議是全雙工的,所以服務器可以隨時主動給客戶端發送數據。相對於HTTP請求需要等待客戶端發起請求服務器才能響應,延時明顯更少;即使是和Comet等類似的長輪詢比較,其也能在短時間內更多次的傳遞數據。

保持連接狀態

        與HTTP不同的,WebSocket需要先創建連接,這使其成爲一種有狀態的協議,之後通信可以省略部分狀態信息,而HTTP請求可能需要在每個請求都攜帶狀態信息(如身份證等)。

更好的二進制支持

        WebSocket定義了二進制幀,相對HTTP,可以更輕鬆的處理二進制內容。

支持擴展

        WebSocket定義了擴展,用戶可以擴展協議、實現部分自定義的子協議。比如部分瀏覽器支持壓縮等。

更好的壓縮效果

       相對HTTP壓縮,WebSocket在適當的擴展支持下,可沿用之前內容的上下文,在傳遞類似的數據時,可以顯著的提高壓縮率。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章