WebSocket發展記錄

參考來源:《構建實時Web應用》

大致的流程就是從Ajax->HTTP長輪詢->HTTP流->WebSocket


<center>#實時性</center>

隨着一個信息的流傳廣度的提高,其價值也會迅速的減小。

而處於一個信息爆炸的時代,大數據,雲計算等的興起,爲什麼google被稱爲google帝國,就是因爲其讓各種數據更容易的被用戶發現,頁面索引的速度意味着我們仍然需要在搜索時等待待發現的數據。所以實時WEB成爲一個非常值得注意的概念,其實實時web已經發展多年了,比如Twitter,FaceBook,甚至微博等等東西,爲什麼可以這麼火,就是因爲各種數據都是實時的,比如一夜短短十幾分鍾便被轉發點贊幾十萬的優衣庫時間,諸如此類
 
爲什麼現在越來越多的人依賴於Internet?其實就是因爲即時信息帶給人們的便捷性和新鮮感。

HTTP絆腳石: 在設計之初,客戶端可以使用該協議請求獲得數據並且接受相應,但是,一些Web應用程序開始要求信息從服務器發送到客戶端,所以我們需要主動的進入客戶端。主動進入客戶端需要非標準,複雜的解決方案。考慮到不同的web瀏覽器支持的特性不同,要同時支持這麼多的特性,必定是複雜的。

其實實時也只是一個寬泛的概念,不同的時間實時性也是不同的。

那麼在解決服務器和客戶端的延遲問題上,其實就是用Ajax來解決的。Ajax即是異步javascript和XML,但是它十分的依賴於瀏覽器中的事件,所以它並沒有真正的解決關於請求內容實時更新的任何問題。於是發明了setInterval()函數來自動刷新的機制,每隔一段時間就檢查一次更新。

然而以數據結構的角度這是一種很浪費資源的行爲,並且效率十分的低下。最明顯的問題就是它創建了許多的空的請求,這爲應用程序帶來了許多不需要的開銷。

然後出現了HTTP長輪詢(long-polling):這種方法打開一個HTTP請求,並且等待一段時間以偵聽服務器的返回。如果有新的數據,那麼服務器就會發送新的數據並且關閉請求,否則,在達到一定的時間限制後。就會關閉請求,打開一個新的請求。降低了開銷,並且減少了應用程序發送的請求數,這種機制使得服務器可以在不需要客戶端部分有任何動作的情況下就通知客戶端有新的數據。**但是如果客戶端和服務器之間需要雙向的通信,那麼如果用HTTP長輪詢就只能再進行一次HTTP請求**,導致了資源的重複使用。而且這個技術還有一個重大的缺點,就是在兩次長輪詢請求之間有一個短小的時間間隔,在這段時間中客戶端的數據與服務器的數據是不同步的,只有重新建立連接後,客戶端才能檢查是否有新的數據。

然後又有一種新的解決方法,就是HTTP流,相比HTTP長輪詢,HTTP流的特點就是在新數據到達或者給定的間隔時間內連接不關閉,新的數據通過一直保持打開的現有連接傳送。這種解決方案的好處是客戶端與服務器間的連接都是持久化的,所以一旦有新的數據,就可以即時的發送給客戶端,所有的新數據也都是通過相同的連接發送的。這保證了服務器和客戶端能夠保持同步。

但是仍然不能提供雙向的通信。並且不同的WEB瀏覽器中的實現方式是不一樣的,所以對應的響應緩衝區會越來越大,大到必須關閉連接,再重新打開。

其實流和長輪詢方式可以直接統稱爲Comet,這是定義一種在應用程序結構中的範式。但是Comet將漸漸被WebSocket取代。這是不可阻擋的趨勢,即使很多人表示這是不可能取代的。

Alex Russell說得特別好的一句話:"以WebSocket爲利器乘風破浪,不再需要那些特別的術語做幌子了。"

**服務器發送事件(Server-Sent Event) 和EventSource API**是HTTP流解決方案的正式方案。
> Server-Sent Events
 需要一個WebSockets服務器處理事件,立即返回給客戶端、 Firefox7支持最新的hybi-10協議,把接受者的id傳給服務端,如果是就更新通知數量、Opera11+。在HTML中添加一個發送向/,客 戶端 等待三秒後再次發出下一個請求、Firefox6+,服務器將立即通知消息。
客戶端打開一個WebSockets連接而且在/,不必爲每個客戶端都分配cpu和內存。

爲什麼WebSocket如此的激動人心,h5也被譽爲跨時代的傑作呢?

因爲WebSocket正式提供了一種標準化的方案來處理了雙向通信的問題。並且爲跨域的通信提供了內置的支持。

大致流程:通信發生在一個用戶代理和一個遠程主機之間。用戶代理在一個受控環境中運行不可信的代碼,遠程主機可以有選擇的與代碼通信,基於Origin的安全模型 ,協議包括初次握手,然後在TCP上進行基本的消息成幀。並且使用單個TCP連接在服務器與客戶端間通信,而不是使用多個TCP連接和單獨的HTTP請求,所以開銷減少了。

但是某    I    姓瀏覽器基礎建設並沒有跟上步伐,google了一下,在IE10之前的版本都是不支持WebSocket的...

##應用舉例

比如現在網上看中國好聲音的實時投票,包括現在很流行的彈幕等等。

頭腦風暴:       畢竟那些已經有的東西,發明人都把錢賺了,那麼以後怎麼賺錢呢...

仔細想想,現在各種實時的東西好像都已經完善了,但是其實大多是虛擬的東西,於是可以在現實世界中找尋它的價值。

                                                                                                                                                                                                                                                                                                                                                            紀念非常有收穫的一下午
                                                                                                                                                                                                                                                                                                                                                            --vampirebitter

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