Javascript Ajax總結——其餘跨域技術之服務器發送事件SSE

SSE(server-Sent Events,服務器發送事件)是圍繞只讀Comet交互推出的API或者模式。

SSE API建立到服務器的單向鏈接,服務器經過這個鏈接能夠發送任意數量的數據。服務器響應的MIME類型必須是text/event-stream,是瀏覽器中的JavascriptAPI能解析輸出的格式。SSE支持短輪詢、長輪詢和HTTP流,能在斷開鏈接時自動肯定什麼時候從新鏈接。

支持SSE的瀏覽器:Firefox6+、Safari5+、Opera11+、Chrome、iOS4+版Safari。

(1)SSE API

建立一個EventSource事件,傳進一個入口點:

var source = new EventSource("myevents.php");

傳入的URL必須與建立對象的頁面同源(相同的URL模式、域及端口)。

EventSource的實例有一個readyState屬性
0:表示正鏈接到服務器;
1:表示打開了鏈接;
2:表示關閉了鏈接。

三個事件
* open:在創建鏈接時觸發。
* message:在從服務器接收到新事件時觸發。
* error:在沒法創建鏈接時觸發。

onmessage事件處理程序:

1 source.onmessage = function(){
2     var data = event.data;
3     //處理數據
4     //數據是字符串格式  
5 }

默認狀況下,EventSource對象會保持與服務器的活動鏈接。若是鏈接斷開,還會從新鏈接。這意味着SSE適合長輪詢和HTTP流。若是想強制當即斷開鏈接而且再也不從新鏈接,能夠調用close()方法。

source.close();

(2)事件流所謂的服務器事件會經過一個持久的HTTP響應發送,這個響應的MIME類型爲text/event-stream。響應的格式是純文本,最簡單的狀況是每一個數據項都帶有前綴data:,如: data: foo data: bar data: foo data: bar事件流中的第一個message事件返回的event.data值爲「foo」,第二個message事件返回的event.data值爲「bar」,第三個message事件返回的event.data值爲「foo\nbar」。對於多個連續的以data:開頭的數據行,將做爲多段數據解析,每一個值之間以一個換行符分隔。只有在包含data:的數據行後面有空行時,纔會觸發message事件,所以在服務器上生成事件流時不能忘了多添加這一行。經過id:前綴能夠給特定的事件指定一個關聯的ID,這個ID行位於data:行前面或後面皆可: data: foo id: 1設置ID後,EventSource對象會跟蹤上一次觸發的事件。若是鏈接斷開,會向服務器發送一個包含名爲Last-Event-ID的特殊HTTP頭部的請求,以便服務器指定下一次該觸發哪個事件。在屢次鏈接的事件流中,這種機制能夠確保瀏覽器以正確的順序收到鏈接的數據段。
相關文章
相關標籤/搜索