我試圖使用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秒之前結束。
我以前在HTTP Streaming API中使用了URLStream,所以它不是對象的限制。這個SO回答(http://stackoverflow.com/questions/7213549/long-polling-http-streaming-general-questions#answer-7347851)提供了一個非常簡單的PHP流式示例,您可以使用它來創建示例應用程序來證明你的Air應用程序工作,然後嘗試連接到真正的服務。 – leggetter
感謝@leggetter,我已經使用你的php示例創建了我的問題的精簡版,並在上面進行了更新。既然你在這裏有經驗,有什麼想法? – evanflash
很高興看到您通過設置「idleTimeout」解決了這個問題。 – leggetter