Http
http是無狀態的協議,不保存會話狀態。http是單向的通信協議,即瀏覽器發起一個Request,服務器回應一個Response。
Ajax
瀏覽器通過輪詢(定時)的方式不斷向服務器請求。這種偽實時的更新方式,效率偏低,一般而言,實時更新的數據,數據量並不大,因此往往容易造成Http請求的Header信息比數據本身還多,而且大量的請求是無用的。
Comet
基於Ajax的長輪詢(long-polling)。瀏覽器發出一個請求,服務器端會阻塞Request直到有數據傳輸或超時才返回。客戶端處理完服務器發送的數據以后,繼續發出請求。
另一種實現Comet技術的方式稱為The forever iframe technique。它通過在頁面中設置一個iframe標簽,將src屬性設置為一個對長連接的請求。缺點是頁面始終會顯示未完全加載。
WebSocket
Websocket是Html5定義的一種新協議,實現了瀏覽器與服務器全雙工通信(full-duplex)。任何支持Html5的瀏覽器都支持WebSocket。瀏覽器發出WebSocket連接請求,服務器發出回應,建立通道,完成handshaking,實現真正的實時通信。websocket允許通過JavaScript建立與遠程服務器的連接,從而實現客戶端與服務器間雙向的通信。
在websocket中有兩個方法:
1、send() 向遠程服務器發送數據
2、close() 關閉該websocket鏈接
websocket同時還定義了幾個監聽函數
1、onopen 當網絡連接建立時觸發該事件
2、onerror 當網絡發生錯誤時觸發該事件
3、onclose 當websocket被關閉時觸發該事件
4、onmessage 當websocket接收到服務器發來的消息的時觸發的事件,也是通信中最重要的一個監聽事件。
websocket還定義了一個readyState屬性,這個屬性可以返回websocket所處的狀態:
1、CONNECTING(0) websocket正嘗試與服務器建立連接
2、OPEN(1) websocket與服務器已經建立連接
3、CLOSING(2) websocket正在關閉與服務器的連接
4、CLOSED(3) websocket已經關閉了與服務器的連接
websocket的url開頭是ws,如果需要ssl加密可以使用wss,當我們調用websocket的構造方法構建一個websocket對象(new WebSocket(url))的之后,就可以進行即時通信了。
總結
Comet在遇到網絡中斷等問題時,很難在不刷新頁面的情況下恢復通信,而WebSocket中提供了一個onclse函數可以用來處理網絡斷開后的情況。
Websocket是雙向通信的,所以可能出現安全問題。
SignalR
SignalR,全稱Microsoft ASP.NET SignalR,是一個使用 C#所寫成的服務器端應用程式稱呼,2012年由微軟所開發。以“定時事件觸發,異步輸入輸出”為其主要理念。
當瀏覽器支持WebSocket時,SignalR使用WebSocket,當不支持時,使用其他技術來保證達到相同的效果。SignalR可以保證在不同的瀏覽器中以相同方式實現WebSocket,並且提供了一些功能擴展以豐富WebSocket。
安裝:使用Nuget ,Install-Package Microsoft.Aspnet.SignalR
示例:Install-Package Microsoft.Aspnet.SignalR.Sample