web Socket和Socket.IO框架

HTTP:

  • http協議是無狀態的,服務器只會響應來自客戶端的請求,但是它與客戶端之間不具備持續連接。
  • 我們可以非常輕鬆的捕獲瀏覽器上發生的事件(比如用戶點擊了盒子),這個事件可以輕鬆產生與服務器的數據交互(比如ajax)。但是,但是反過來確實不可能的:服務器發生了一個事件,服務器無法將這個事件的信息實時主動通知它的客戶端,只有在客戶端查詢服務器的當前狀態的時候,所發生事件的信息纔會從服務器傳遞到客戶端。

但是,確實聊天室確實存在。

方法:

  • 長輪詢:客戶端每隔很短的時間,都會對服務器發出請求,查看是否有新的信息,只要輪詢速度足夠快。例如1秒,就能給人造成交互是實時進行的印象。這種做法是無奈之舉,實例上對服務器、客戶端雙發都造成了大量的性能浪費。
  • 長連接:客戶端只請求一次,但是服務器會將連接保持,不會返回結果(想象一下我們沒有寫res.end()時間,瀏覽器一直轉小菊花)。服務器有了新數據,就將數據發回來,又有了新數據。就將數據發回來,而一直保持掛起狀態。這種做法的也造成了大量的性能浪費。

websocket協議能夠讓瀏覽器和服務器全雙實時通信,互相的,服務器也能主動通知客戶端了。

  • websocket的原理非常的簡單:利用HTTP請求產生握手,HTTP頭部中含有websocket協議的請求,所以握手之後,二者轉用TCP協議進行交流(QQ的協議)。現在的瀏覽器和服務器之間,就是QQ和QQ服務器的關係了。
    所以websocket協議,需要瀏覽器支持,更需要服務器支持。
  • 使用websocket協議,需要瀏覽器和服務器支持纔可以使用
  • 支持websocket協議的瀏覽器有:Chrome4、火狐4、IE10、Safari5
  • 支持websocket協議的服務器有:node0、apache7.0.2、nginx1.3

nodejs上需要寫一些程序,來處理TCP請求。

  • nodejs從誕生之日起,就支持websocket協議。不過,從底層一步一步搭建一個socket服務器費勁(想象一下nodejs寫一個靜態文件服務器都那麼費勁)。所以,有大神幫我們寫了一個庫Socket.IO
  • Socket.Io是業界良心,新手福利,它屏蔽了所有底層細節,讓頂層調用非常簡單,並且還爲不支持websocket協議的瀏覽器,提供了長輪詢的透明模擬機制。
  • node的單線程、非阻塞I/O、事件驅動機制,使它非常適合socket服務器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章