前端如何 及時獲得服務器更新通知?

 Comet

更高級的Ajax技術,服務器向頁面推送數據。 
兩種實現Comet的方式:長輪詢和流。 
Ajax與Comet-Comet長輪詢 
(1)長輪詢:頁面發起一個到服務器的請求,然後服務器一直保持連接打開,直到有數據可發送。發送完數據之後,瀏覽器關閉連接,隨即又發起一個到服務器的新請求。【區別:短輪詢,服務器立即發送響應,無論是否有效,而長輪詢是等待發送響應。】

(2)HTTP流:生命週期內只使用一個HTTP連接。瀏覽器向服務器發送一個請求,而服務器保持連接打開,然後週期性地向瀏覽器發送數據。

/**
 * progress:接收數據時調用的函數
 * finished:關閉連接時調用的函數
 */
function createStreamingClient(url, progress, finished){        
    var xhr = new XMLHttpRequest(),
        received = 0;

    xhr.open("get", url, true);
    xhr.onreadystatechange = function(){
        var result;
        if (xhr.readyState == 3){
            //get only the new data and adjust counter
            result = xhr.responseText.substring(received);
            received += result.length;

            //call the progress callback
            progress(result);
        } else if (xhr.readyState == 4){
            finished(xhr.responseText);
        }
    };
    xhr.send(null);
    return xhr;
}

var client = createStreamingClient("streaming.php",function(data){alert("Received: " + data);}, function(data){alert("Done!");});

服務器發送事件:SSE和事件流


Web Sockets

目標是在一個單獨的持久連接上提供全雙工、雙向通信。 
優點:能夠在客戶端和服務器之間發送非常少量的數據,而不必擔心HTTP那樣字節級的開銷。 
缺點:制定協議的時間比制定JavaScript API的時間還要長。

// 必須給WebSocket構造函數傳入絕對URL
var socket = new WebSocket("ws://www.example.com/server.php");
// 向服務器發送數據(只能發送純文本,其他數據需要序列化)
socket.send("Hello");
// 接收服務器的響應數據
socket.onmessage = function(event) {
    var data = event.data;
};

其他事件:

  • open:在成功建立連接時觸發。
  • error:在發生錯誤時觸發,連接不能持續。
  • close:在連接關閉時觸發。

注意:WebSocket對象不支持DOM 2級事件偵聽器,必須使用DOM 0級語法分別定義各個事件。


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