Comet
更高級的Ajax技術,服務器向頁面推送數據。
兩種實現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級語法分別定義各個事件。