Изящное восстановление после сбоя загрузки файла политики - PullRequest
1 голос
/ 01 апреля 2011

Прежде всего: это не другой вопрос о том, как загрузить файл политики.

У меня есть приложение в разработке, которое подключается к серверу сокетов, получает файл политики и работает просто отлично. Однако, когда сервер сокетов по какой-либо причине не работает, мне нужно изящно использовать альтернативный метод получения сообщений от сервера (в основном опрос).

Это не проблема, кроме одного:

Error: Request for resource at xmlsocket://[ip]:4770 by requestor from http://[ip]/cooking/Client.swf has failed because the server cannot be reached.

Кажется, нет способа поймать это. У меня есть слушатели событий на моем сокете:

addEventListener(Event.CLOSE, closeHandler);
addEventListener(Event.CONNECT, connectHandler);
addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);

SecurityErrorEvent - это то, что, как вы думаете, срабатывает, но это не так. Документы говорят, что это происходит по следующим причинам:

  1. Локальные ненадежные SWF-файлы могут не взаимодействовать с Интернетом. Вы можете обойти это ограничение, переклассифицировав файл как локальный с сетевым подключением или как доверенный.
  2. Вы не можете указать порт сокета выше 65535.
  3. На странице HTML, которая содержит SWF-контент, разрешить сеть параметр объекта и встраивать для тегов установлено значение "none".

Так что ни один из них не применим. Похоже, что я действительно хочу поймать, это сбой загрузки файла политики, но даже выполнение явного Security.loadPolicyFile () не поможет, поскольку эта загрузка откладывается до первого запроса сокета И не запускает никаких событий .

Для полноты я также окружил вызов connect () попыткой {} catch (e: *) {}, безрезультатно.

Должен быть способ отсортировать это. Есть идеи? Мне просто нужен способ узнать, когда произошел сбой соединения из-за проблем с сетью, и попробовать альтернативный путь.

РЕДАКТИРОВАТЬ: Несмотря на мои предыдущие тесты и документы, кажется, SecurityErrorEvent срабатывает - только он делает это примерно через 20 секунд после сбоя загрузки, так что это не очевидно. Я думаю, это так же быстро, как я собираюсь получить от Flash.

1 Ответ

0 голосов
/ 01 апреля 2011

Не забудьте повторить подключение :)

private function onIOError(e:IOErrorEvent):void {
  e.stopPropagation();
  ++this.retryCount;
  if( this.retryCount >= 12 ){
    this.connectTimer.stop();
    this.dispatchEvent( new Event( 'TIMIEDOUT' ) );
  }else{
    this.err = 'IO-ERROR-EVENT - ' + e.text + '\r\nAttempting to reconnect';
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...