Ошибка сокета - иногда? - PullRequest
       1

Ошибка сокета - иногда?

5 голосов
/ 05 сентября 2010

Итак - у меня есть этот Socket (не XMLSocket, просто Socket) клиент. У меня также есть собственный скрипт PHP на моем сервере, который прослушивает порт X. Мой клиент пытается подключиться к нему.

Все отлично работает, безопасность и связь, синхронизация и все остальное. Но - Flash Player (собственно среда выполнения AIR) выдает ошибку при попытке подключения, но ТОЛЬКО, когда сервер не работает ... Что? Это действительно странно - ошибка на самом деле обрабатывается try catch (IOError), и даже более странно, строка, которая указывается в выводе как строка ошибки, - это строка, в которой я просто СОЗДАЮ Socket ...?

Хм ...

Выход:

Error #2044: Unhandled IOErrorEvent:. text=Error #2031: Socket Error.
    at ---.server::Client()[---/server/Client.as:167]
    at Function/<anonymous>()[---_fla.MainTimeline::frame1:430]
    at Function/<anonymous>()
    at Function/<anonymous>()[---_fla.MainTimeline::frame1:375]

Код:

try {
    Sock = new Socket(); // THIS is line 167
} catch (e:IOError){
    log("Could not connect!");
    status = "disconnected";
}

Это на самом деле не имеет значения - сервер, как предполагается, все еще в сети, ошибки не будут отображаться ... Но игнорировать ошибку нехорошо.

Еще одна вещь: когда я закомментирую строку, где я на самом деле соединяюсь, используя Sock.connect (...) - он не выдает ошибку, но, очевидно, не работает ... Кроме того, часть соединения также в блоке try catch (IOError) ...

ПОЧЕМУ Flash говорит, что проблема в строке 167, когда она явно в другом месте? И / или в чем может быть проблема?

Ответы [ 3 ]

9 голосов
/ 05 сентября 2010

Это может показаться неочевидным, если вы ранее не работали с Flash, но многие ошибки в net api являются асинхронными. Это означает, что вы не можете перехватить их с помощью блока catch, потому что ошибка выдается не при выполнении метода connect, а на более позднем этапе.

На самом деле, в сообщении об ошибке говорится, что у вас есть необученный IOErrorEvent, а не IOError.

Это покрыто здесь:

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/Socket.html#connect()

По сути, вы должны добавить обработчик для IOErrorEvent (добавление одного для SecurityErrorEvent также является хорошей идеей). Примерно так:

private function connect():void {
    socket = new Socket(host,port); 
    //  handle asynchronous errors in these handlers
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    try {
        socket.connect();
    } catch(ioError:IOError) {
    //  handle synchronous errors here  
    } catch(secError:SecurityError) {
    // and here
    }
}

private function ioErrorHandler(event:IOErrorEvent):void {
    trace("ioErrorHandler: " + event);
}

private function securityErrorHandler(event:SecurityErrorEvent):void {
    trace("securityErrorHandler: " + event);
}
0 голосов
/ 13 февраля 2014

Я получил ошибку в той же ситуации с мастером и исправил ее, изменив порядок закрытия и удалив прослушиватель событий.

0 голосов
/ 02 июля 2013

Я столкнулся с похожей ошибкой.Это происходило потому, что перед удалением sock.close () я удалил обработчик ioErrorHandler (removeEventListener).sock.close () может выдать IoErrorEvent.

Несмотря на то, что ioErrorEvent был вызван sock.close (), отладчик показал это как необработанную ошибку в строке, где вызывался конструктор сокета.1004 * Вызов removeEventListener () после того, как sock.close () решил проблему.

Надеюсь, это поможет.

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