2011-09-26 73 views
1

我試圖使用AIR應用程序連接到現有的Comet式長輪詢服務。該服務期望客戶端通過Connection:Keep-Alive頭進行GET請求。此請求將長時間保持打開狀態,以便服務器可以推送數據。 在我的應用程序中,連接在30秒後以IOError終止。使用URLStream在AIR中進行Comet式長輪詢

這是URLStream的一個未記錄的限制嗎?對adl的限制(我只通過adl運行我的應用程序)?

服務器不會向客戶端發送任何「保持活動」的消息,但不幸的是,這不是我控制的東西。

更新

爲了測試這一點,我用一個小PHP腳本建立一個精簡版(由leggetter下面的鏈接)和我從一個簡單的AIR應用程序打它。我發現無論使用URLStream還是URLLoader,我的連接都在30秒後關閉。 的PHP:

<?php 
set_time_limit(0); 

sleep(40); 
echo("START!"); 

header('Content-type: text/plain'); 
echo str_pad('PADDING', 2048, '|PADDING'); 

$sleep_time = 1; 
$count = 0; 
while($count < 20) { 
    echo($count); 
    flush(); 
    $count = $count + 1; 
    sleep($sleep_time); 
} 
echo("end"); 
?> 

而且動作腳本:

private function beginSubscribeToNotifications():void { 
    var req:URLRequest = new URLRequest(myPHPFile); 
    req.method = URLRequestMethod.GET; 
    req.requestHeaders.push(new URLRequestHeader("Connection", "Keep-Alive")); 

    _urlLoader = new URLLoader(); 
    _urlLoader.addEventListener(Event.COMPLETE, onComplete); 
    _urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
    _urlLoader.load(req); 
} 

private function onComplete(e:Event):void { 
    _message = (String)(_urlLoader.data); 
} 

如果我調整在PHP腳本任何超過30秒,初始睡眠時間,會觸發IOError事件。如果我降低睡眠時間,但請求繼續添加數據超過30秒,則會調用onComplete事件,但_urlLoader.data爲空。

這個過程完全成功的唯一方法是如果整個事情在30秒之前結束。

+1

我以前在HTTP Streaming API中使用了URLStream,所以它不是對象的限制。這個SO回答(http://stackoverflow.com/questions/7213549/long-polling-http-streaming-general-questions#answer-7347851)提供了一個非常簡單的PHP流式示例,您可以使用它來創建示例應用程序來證明你的Air應用程序工作,然後嘗試連接到真正的服務。 – leggetter

+0

感謝@leggetter,我已經使用你的php示例創建了我的問題的精簡版,並在上面進行了更新。既然你在這裏有經驗,有什麼想法? – evanflash

+0

很高興看到您通過設置「idleTimeout」解決了這個問題。 – leggetter

回答

1

好吧,這有點令人尷尬,但我想我會張貼,以防其他人跑到這。 我已通過設置值URLRequestDefaults.idleTimeout解決了我的問題。

根據文檔: 當此屬性設置爲0(默認值)時,運行時使用操作系統定義的默認空閒超時值。操作系統(如Mac OS,Linux或Windows)和操作系統版本之間的默認空閒超時值有所不同。

我猜測Windows 7的時間是30秒。