所以 - 我有这个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行,显然是在其他地方?和/或可能是什么问题?
答案 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)
我在向导的相同情况下得到了错误,并通过更改关闭顺序并删除事件监听器来修复它。