Я пытаюсь подключиться к существующей службе длинных опросов в стиле Comet с помощью приложения AIR. Служба ожидает, что клиент сделает запрос GET с заголовком Connection: Keep-Alive. Этот запрос будет оставаться открытым в течение длительных периодов времени, чтобы сервер мог передавать данные.
В моем приложении соединение прерывается с IOError через 30 секунд.
Это недокументированное ограничение URLStream? Ограничение для adl (я только запускал свое приложение через adl)?
Сервер не отправляет клиенту никаких сообщений "keep-alive", но, к сожалению, это не то, что я контролирую.
Обновление
Чтобы проверить это, я установил урезанную версию с помощью небольшого php-скрипта (ссылка на которую приведена ниже) и запускаю его из простого приложения AIR. Я обнаружил, что мои соединения закрываются через 30 секунд, независимо от того, использую ли я URLStream или URLLoader.
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");
?>
И ActionScript:
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 секунд.