2011-05-03 38 views
1

我想解決如何做流和IE瀏覽器和長輪詢沒有摺疊服務器。這裏是我想到的。IE Ajax流/長輪詢沒有摺疊服務器

我將有一個名爲TimeServlet的servlet。

在doGet或doPost()..我會暫停請求並在每秒鐘發送時間。

 

.... 
suspend() 

while(!stopped){ 
    request.writeln(new Date().toString()); 
} 
 

或與調度程序和Runnable,但你明白了。

在javascript中的客戶端上,我將創建一個ajax連接。

我的大問題是:

1 - 如何使用IE瀏覽器進行流式傳輸?使用Firefox和Chrome時,我在readyState == 3時讀取數據,但在IE中,數據僅在readyState == 4上可用。

2 - 如何在本例中進行長輪詢?長輪詢塊,直到服務器有數據推送,但在這個例子中,服務器將總是有東西推,所以客戶端會做while(true)和洪泛的服務器。我想我必須這樣做

ajax.push(null)... on readyState == 4 - > read ... setTimeout(resendRequest,1); //1秒 ?

有人有這樣的樣本嗎?

我的代碼適用於FF和Chrome,但現在我正在尋找IE和Opera。

編輯

我發現我可以在IE中使用XDomainRequest流媒體。你必須在你的服務器代碼中有:

response.setHeader(「Access-Control-Allow-Origin」,「*」);

我不會回答這個問題,因爲我不知道如何檢測連接是否完成。

用Ajax,很簡單.. ReadyState == 4。但我不知道XDomainRequest。

我需要能夠在連接關閉時觸發一些JavaScript回調。有任何想法嗎 ?

+0

我從來沒有在IE中做過彗星,但這裏是允許您在接收數據時獲取數據的對象,[XDomainRequest](http://msdn.microsoft.com/zh-cn/library/cc288060( v = vs.85)的.aspx)。進行中的事件應該在數據傳輸並給你訪問時觸發。我從來沒有試過,所以我再也忍不住了,抱歉:/ – Andrew 2011-05-04 20:02:10

+0

謝謝,但它與普通的「Msxml2有點不同。XMLHTTP「,」Microsoft.XMLHTTP「,但只適用於state4。http://msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx – 2011-05-04 23:51:30

+0

@Sebastien是的,它是不同的,但它是獲得IE8或更低版本訪問權限的唯一方式,請參見[Here](http://blogs.msdn.com/b/ieinternals/archive/2010/04/06/comet-streaming-in-internet-explorer -with-xmlhttprequest-and-xdomainrequest.aspx) – Andrew 2011-05-05 14:28:21

回答

1

我發現瞭如何檢測關閉事件。你必須使用onload方法。

因此,代碼會看起來像

 

var ajaxRequest = new XDomainRequest(); 


ajaxRequest.onload = function() { 
//alert("[XDR-onload]. responseText: " + ajaxRequest.responseText + ""); 
}; 

ajaxRequest.onerror = function() { alert("[XDR-onerror] Fatal Error."); }; 

ajaxRequest.ontimeout = function() { 
alert("[XDR-ontimeout] Timeout Error."); 
}; 
ajaxRequest.onprogress = function() { 
//alert("[XDR-onprogress] responseText so far: " + ajaxRequest.responseText + ""); 
}; 
 

,不要忘記添加在響應中的報頭(服務器端)

response.setHeader(「訪問控制允許來源」, 「*」);