webSocket協議和Socket.IO

1、Http沒法輕鬆實現實時應用:

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

2、長輪詢、長鏈接

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

3、WebSocket協議

● 最新的HTML5協議,制定了WebSocket協議標準,容許客戶端和服務器以全雙工的方式進行通訊。
● WebSocket的原理很是的簡單:利用HTTP請求產生握手,握手以後,兩者轉用TCP協議進行交流(QQ的協議)。
● 使用WebSocket協議,須要瀏覽器和服務器都支持纔可使用。
● 支持WebSocket協議的瀏覽器有:Chrome 4、火狐四、IE十、Safari5
● 支持WebSocket協議的服務器有:Node 0、Apach7.0.二、Nginx1.3

4、Socket.IO

  官網地址:https://socket.io/docs/rooms-and-namespaces/express

● Node.js從誕生之日起,就支持WebSocket協議。不過,從底層一步一步搭建一個Socket服務器很費勁(想象一下Node寫一個靜態文件服務都那麼費勁)。因此,有大神幫咱們寫了一個庫Socket.IO。
● Socket.IO是業界良心,新手福音。它屏蔽了全部底層細節,讓頂層調用很是簡單。而且還爲不支持WebSocket協議的瀏覽器,提供了長輪詢的透明模擬機制。
● Node的單線程、非阻塞I/O、事件驅動機制,使它很是適合Socket服務器。

5、Socket.IO配置

  一、服務器端的配置

● 當server建立出來以後,語句
var io = require('socket.io')(server);
可以實例化io對象,此時網址/socket.io/socket.io.js將被默認提供一個靜態js文件服務。
● 監聽:
io.on("connection",function(socket){
});
● socket對象有emit方法和on方法。emit方法用於發送一個自定義事件,on方法用於監聽服務器發送的自定義事件。

  二、客戶端的配置

● HTML頁面必須運行在服務器上,不能爲本地。
● HTML頁面須要引用/socket.io/socket.io.js文件,而後執行io()函數,並獲得socket對象。
● socket對象有emit方法和on方法。emit方法用於發送一個自定義事件,on方法用於監聽服務器發送的自定義事件。

    三、express和Socket.IO

●Express框架能夠和Socket.IO搭配使用,可是不能像一般的Express程序那樣,用app.listen進行監聽了,而是採用一種固定的模式:
    var express = require('express'); var app = express(); var http = require('http').Server(app); var io = require('socket.io')(http); http.listen(3000);
相關文章
相關標籤/搜索