WebSocket-01 概念以及相關
寫在前面
本人是搞技術的,由衷的喜歡技術。其實我想大多數開發人員喜歡技術的並不多,多數為了工作而不得不學習新的技術。但是我是那種喜歡技術的,除了工作中會用的新計劃我會去研究,業餘時間我也喜歡研究和學習新的技術。當然,鄙人學習新的技術本質的目的不是在於跳槽,起初的目的就是為了好玩!
有時想想,我在研究學習的時候,也許別人正在流連忘返與各種娛樂場所,當時我想說其實那只是他們的愛好,那麼我的愛好就是寫程式碼,其實也沒所謂…道不同何必去管別人!
一種Html5的協議
WebScoket的字眼對於學過各種程式語言的開發者來說並不陌生,尤其“Socket”這個詞,想到這個詞,我們就會想到 UDP、TCP、Http等等各種傳輸協議。Http協議大家很是熟悉,所有的www的檔案都必須遵守這個標準,協議協議顧名思義就是為了統一管理大家約定的一個傳輸方式。大家都知道以往的html標準都是基於http協議的,那麼伴隨著html5的建立,在html5標準中新來的一個新的字眼websokcet。Websocket跟http一樣,都是基於tcp協議的一種擴充套件。從概念的角度來說,業務費就是滿足現有web需求,建立的一種新的web傳輸方式。
傳統即時通訊的做法
一個新的技術的出現和一種新的標準的建立,其實大致都是為了解決實際問題,提供了一項新的解決方案。Websocket也是如此,那麼首先我們分析一下websocket的基於html5的問題而出現,它到底跟傳統的http協議有哪些異同點呢?
其實對比這兩個問題,我們最好例句一個應用場景來描述這個問題,這樣也比較切合實際,虛頭巴腦的技術講解其實是對技術的一種玷汙。
現在一家公司想做web應用《web內部及時通訊》,我們想到即時通訊技術,我們其實很快就會聯想到QQ、微信等相關產品,但是但多數是基於PC端,基本是利用TCP、UDP協議去實現的。那麼對於http協議而言的web程式一般公司卻做的很少,不是因為不需要,而是這的確有些難度,當然像騰訊webqq版做的真是沒話說。且不去研究騰訊是如何做的,我們先來看看傳統做web及時通訊都有哪些方案。
1. Ajax輪詢
2. 長連線
3. Comet
4. Flash、applet
第一點說白了,就是啟用js去啟用一個定時任務,每隔一個定時時間就去請求一次伺服器後臺,讀取最新的訊息,然後客戶端進行顯示。其實這種方式目前依然還是被很多公司或者說是技術人員去使用,之所以沒有思考升級他們的這種方案,是因為目前他們用這種方式還沒有遇到問題,之所以沒遇到問題,我的意思其實是說,他們的應用線上使用者還很少,呵呵~~這樣功能其實可以實現,但是這樣的方式,客戶端就會不停的開啟和服務端的連結,在併發量很大的網際網路應用中,這種做法是相當危險的,他基本上是集聚而且又是一種持續的加大著服務端的壓力。
第二點:HTTP長連線這種把資料從伺服器主動“推”到客戶端的技術,能帶來的好處不言而喻。它可以把最新的統計資料輸出到客戶端,也可以實現即時通訊。HTTP1.1支援持久連線。如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼Connection:keep-alive。TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了頻寬。結合服務端的處理,再加上一定觀察者模式或其它則可以再一定程度上去優化。
第四點:Flash applet 以及很多外掛的模式,其實就是在瀏覽器上跨越http協議,使用本地Socket 和服務端進行相關互動。這個模式的不好的一點就是瀏覽器需要裝外掛,這個時候也會就會存在瀏覽器差異等不穩定的情況。
總結:無論以上那種方式,可以大致分為兩點:第一,用長連線的方式進行處理,比如技術Comet或者Comet後的pushlet 基本上都是利用長連線支援,來在服務端做優化以及處理。第二,在瀏覽器上做手腳,利用瀏覽器上的外掛模式,進行建立誇http協議之外的sokcet通訊。
Websocket原理
WebSocketprotocol 。
現很多網站為了實現即時通訊,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的資料給客服端的瀏覽器。這種傳統的HTTP request 的模式帶來很明顯的缺點 – 瀏覽器需要不斷的向伺服器發出請求,然而HTTP request 的header是非常長的,裡面包含的有用資料可能只是一個很小的值,這樣會佔用很多的頻寬。
而比較新的技術去做輪詢的效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工通訊,但依然需要發出請求。
在 WebSocket API,瀏覽器和伺服器只需要要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送。在此WebSocket 協議中,為我們實現即時服務帶來了兩大好處:
1. Header
互相溝通的Header是很小的-大概只有 2 Bytes
2. Server Push
瀏覽器
伺服器
在伺服器端,也出現了一些實現websocket協議的專案:
jetty 7.0.1 包含了一個初步的實現
resin 包含有websocket 實現
pywebsocket,apache http server 擴充套件
apache tomcat7.0.27 版本
Nginx 1.3.13 版本
jWebSocket java實現版
websocket api在瀏覽器端的廣泛實現似乎只是一個時間問題了, 值得注意的是伺服器端沒有標準的api, 各個實現都有自己的一套api, 並且jcp也沒有類似的提案, 所以使用websocket開發伺服器端有一定的風險.可能會被鎖定在某個平臺上或者將來被迫升級.
(個人微訊號) (技術公眾號)