关键是监听Socket对象的IOErrorEvent.IO_ERROR事件。在您所指的情况下,连接立即被拒绝,此事件将立即触发。事实上,它可以被触发得如此之快以至于你会错过它,除非你按照正确的顺序做事(如此处所示):
// first create the unconnected socket, and add the listener
// you *must* add the listener *before* connecting the socket
//
var mySocket = new Socket();
mySocket.addEventListener(IOErrorEvent.IO_ERROR, function(event:IOErrorEvent):void {
// called when error occurrs
trace("ioErrorHandler: " + event);
});
mySocket.addEventListener(flash.events.Event.CONNECT, function(event:Event):void {
// handle a successful connection here
//...
});
// now initiate the connection to port 80 on "server.example.com"
mySocket.connect( 'server.example.com', 80 );
注意:这种方法不是基于超时。如果服务器返回一个明确的“连接被拒绝”响应,那么 IO 错误事件将在收到该响应时立即发生。
超时仅适用于服务器长时间没有返回任何内容的情况。这可能发生在某些服务器/防火墙配置中,实际上丢弃数据包而不是返回“连接被拒绝”。发生这种情况时,客户端(在本例中为 Flash)将等待超时到期。当超时最终到期时,它会像您预期的那样导致IOErrorEvent.IO_ERROR 事件。
默认套接字超时取决于平台,但它总是相当长(~20-30 秒或更长时间)。 Socket.timeout 属性是在 Flash Player 版本 10 和 Air 1.0 中引入的。据我所知,在 Flash Player 10 之前,无法使用 ActionScript 调整套接字超时。
祝你好运!
--- 编辑:如果仍然无法正常工作,请继续阅读 ---
您还应该熟悉 Flash 播放器查找(并要求)套接字策略文件的方式。丢失或损坏的套接字策略文件有时会产生看起来像套接字等待超时的行为。引用this Adobe Document:
默认情况下禁用对套接字和 XML 套接字连接的访问,即使套接字
您要连接的域与 SWF 文件位于同一域中。您可以允许套接字级别
通过从以下任何位置提供套接字策略文件进行访问:
- 端口 843(主策略文件的位置)
- 与主套接字连接相同的端口
- 与主套接字连接不同的端口
这意味着,除非您之前使用Security.loadPolicyFile() 加载了策略文件,否则当您最初尝试将套接字连接到服务器时,flash 将首先尝试解析策略文件。在某些情况下,这可能会导致奇怪的连接延迟或其他意外行为。如果您认为您可能会遇到此问题,您应该首先为flash.events.SecurityErrorEvent.SECURITY_ERROR 添加一个侦听器。