所以 - 我有这个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/()[---_fla.MainTimeline::frame1:430] at Function/ () at Function/ ()[---_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行,显然是在其他地方?和/或可能是什么问题?
如果您以前没有使用过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); }