套接字错误 - 有时候?

时间:2010-09-05 12:07:13

标签: actionscript-3 sockets air

所以 - 我有这个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 个答案:

答案 0 :(得分:9)

如果您以前没有使用过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);
}

答案 1 :(得分:0)

我遇到了类似的错误。这是因为我在发出sock.close()之前删除了处理程序ioErrorHandler(removeEventListener)。 sock.close()可以抛出一个IoErrorEvent。

即使sock.close()抛出了ioErrorEvent,调试器也会在调用套接字构造函数的行中将其显示为未处理的错误。

在sock.close()解决问题后调用removeEventListener()。

希望这有帮助。

答案 2 :(得分:0)

我在向导的相同情况下得到了错误,并通过更改关闭顺序并删除事件监听器来修复它。