Длинный опрос в стиле кометы в AIR с использованием URLStream - PullRequest
1 голос
/ 26 сентября 2011

Я пытаюсь подключиться к существующей службе длинных опросов в стиле 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 секунд.

1 Ответ

1 голос
/ 30 сентября 2011

Что ж, это немного смущает, но я решил опубликовать, если кто-то еще натолкнется на это. Я решил свою проблему, установив значение URLRequestDefaults.idleTimeout .

Согласно документации: Когда для этого свойства установлено значение 0 (по умолчанию), среда выполнения использует значение времени ожидания простоя по умолчанию, определенное операционной системой. Значение времени ожидания простоя по умолчанию варьируется в зависимости от операционной системы (например, Mac OS, Linux или Windows) и между версиями операционной системы.

Полагаю, для Windows 7 это было 30 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...