websocket


websocket 基於http協議(websocket的握手時基於http發起的)、達到實時推送的效果,以前好多需要實時獲取的服務信心都是通過ajax輪詢或者 long poll來實現,但消耗資源且存在延遲。


ajax poll :客戶端不斷詢問服務端是否有信息給自己
long poll:  阻塞式輪詢(客戶端發起連接後,直到服務端返回信息,則結束本次連接,接着建立新連接,這樣周而復始)

以上兩種方式都是在不斷的建立新的http連接,等待服務端處理,http是被動的,服務端不能主動聯繫客戶端

websocket解決的http的幾大難題:
    當服務器完成協議升級後(HTTP->Websocket),服務端就可以主動推送信息給客戶端啦,
    只需要經過一次HTTP請求,就可以做到源源不斷的信息傳送了
    解決了輪詢同步有延遲,而且還非常消耗資源的這種情況,
    同時克服了http的無狀態性(解決了要反覆解析HTTP協議,還要查看identity info的信息)


知乎上有人說道:

WebSocket 解決的第一個問題是,通過第一個 HTTP request 建立了 TCP 連接之後,之後的交換數據都不需要再發 HTTP request了,使得這個長連接變成了一個真.長連接
另一個巨大的存在是中間的網絡鏈路。一個 HTTP/WebSocket 連接往往要經過無數的路由,防火牆

在這過程中,中間節點的處理方法很可能會讓你意想不到,比如說,這些坑爹的中間節點可能會認爲一份連接在一段時間內沒有數據發送就等於失效,它們會自作主張的切斷這些連接。


而解決方案,WebSocket 的設計者們也早已想過。就是讓服務器和客戶端能夠發送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol)。這種 Frame 是一種特殊的數據包,它只包含一些元數據而不需要真正的 Data Payload,可以在不影響 Application 的情況下維持住中間網絡的連接狀態。

https://tools.ietf.org/html/rfc6455
https://tools.ietf.org/html/rfc6455#section-5.5.2


websocket實現:

前端:

值的一提的Socket.io  它通過Node.js實現WebSocket服務端,同時也提供客戶端JS庫。http://Socket.IO支持以事件爲基礎的實時雙向通訊,它可以工作在任何平臺、瀏覽器或移動設備。


後端:

Java EE 7引入了一系列新的API並修改了部分既有的API以滿足web開發者使用HTML5的相關需求。這些新的API主要由三個方面組成:處理JSON的新API、針對JSF的新屬性處理的重大更新以及支持WebSocket協議(組成HTML5的衆多技術之一)的最新API

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/HomeWebsocket/WebsocketHome.html


java基於tomcat實現demo:(客戶端連接服務器後,服務器每隔一段時間向客戶端推送信息),

code地址:https://github.com/langlichong/java-websocket-tomcat


  




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