1. 程式人生 > >WebSocket-01 概念以及相關

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開發伺服器端有一定的風險.可能會被鎖定在某個平臺上或者將來被迫升級.

(個人微訊號)  (技術公眾號)