从策略文件加载失败中恢复正常

时间:2011-04-01 11:21:17

标签: flex security sockets

首先:这不是关于如何加载策略文件的另一个问题。

我有一个开发中的应用程序连接到套接字服务器,获取策略文件并且只是花花公子。但是,当套接字服务器由于某种原因而关闭时,我需要优雅地回退到另一种从服务器获取消息的方法(基本上是轮询)。

这不是问题,除了一件事:

Error: Request for resource at xmlsocket://[ip]:4770 by requestor from http://[ip]/cooking/Client.swf has failed because the server cannot be reached.

似乎没有办法解决这个问题。我的socket上有这些事件监听器:

addEventListener(Event.CLOSE, closeHandler);
addEventListener(Event.CONNECT, connectHandler);
addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);

SecurityErrorEvent是您可能会想到的,但事实并非如此。文档说这是因为这些原因引发的:

  1. 本地不受信任的SWF文件可能无法与Internet通信。您可以通过将文件重新分类为local-with-networking或受信任来解决此限制。
  2. 您无法指定套接字端口 高于65535。
  3. 在包含的HTML页面中 SWF内容,allowNetworking 对象的参数和嵌入 标签设置为“无”。
  4. 所以这些都不适用。看起来我真正想要捕获的是加载策略文件失败,但即使做一个显式的Security.loadPolicyFile()也无济于事,因为该加载被推迟到第一个套接字请求并且不会触发任何事件

    为了完整性,我还使用try {} catch(e:*){}包围了对connect()的调用,没有结果。

    必须有办法对此进行排序。有任何想法吗?我只需要一种方法来判断连接何时因网络问题而失败并尝试替代路径。

    编辑:尽管我以前的测试和文档,看起来SecurityErrorEvent确实会触发 - 只有它在加载失败后大约20秒才会发生,所以它并不明显。我想这就像我要从Flash获得的那样直接。

1 个答案:

答案 0 :(得分:0)

别忘了重试连接:)

private function onIOError(e:IOErrorEvent):void {
  e.stopPropagation();
  ++this.retryCount;
  if( this.retryCount >= 12 ){
    this.connectTimer.stop();
    this.dispatchEvent( new Event( 'TIMIEDOUT' ) );
  }else{
    this.err = 'IO-ERROR-EVENT - ' + e.text + '\r\nAttempting to reconnect';
  }
}