`

解决AS3 Socket编程中最令人头疼的问题

    博客分类:
  • AS3
阅读更多

在家上网赚钱更容易

什么是最令人头疼的问题?也许大家会异口同声的说:“安全问题”,不错,不仅仅是AS3 的Socket,整个AS3语言中最令人头疼的问题也无非就是安全问题了。

很 多同行的兄弟在郁闷的时候就会骂Adobe。但是,骂归骂,问题终归是要解决的,Adobe做这样的限制肯定是有他的用意的,大家都知道,swf文件是很 容易被反编的,那么也就是说你的swf文件内部与服务器通信的方式及路径是很容易被别人发现的,如果你的服务器中没有任何访问限制,那么你的服务器很容易 被一些人攻破,这并不需要很高的水平,只要一直刷,你的服务器就完了。

兄弟,您骂够了吗?我们来解决问题吧?

用Java写完Socket服务器后,运行,一切正常,用Flex写全Socket客户端后,运行,一切正常,可是当把生成的swf文件拷到其它地方来运行就出错了,总是无法连接服务器,然后就开始抛securityError,下面我们看一下输出信息。

打 开Flash CS3,打开远程调试器,选择菜单如 Debug->Begin Remote Debug Session->ActionScript3.0(中文版选择菜单如:调试->开始 远程调试会话->ActionScript3.0),下面我们打开客户端swf文件(记得此文件一定是调试版swf),则它会自动连接Flash CS3 的调试器,在Flash CS3中输出相关的调试信息。

可以看到输出信息如下:

------------------------------------

[SWF] C:\Users\Administrator\Desktop\MyClientFlash.swf - 1112717 bytes after decompression

警告: [strict] 将忽略 xmlsocket://localhost:9999 处的策略文件,因为出现语法错误。请访问 http://www.adobe.com/go/strict_policy_files_cn 以解决此问题。

 

 

*** 安全沙箱冲突 ***

到 localhost:9999 的连接已停止 - 不允许从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 进行连接

错误: 拒绝请求位于 xmlsocket://localhost:9999 的资源(请求者从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 发出请求),原因是缺乏策略文件权限。

------------------------------------

原因是没有在服务器的9999端口放置安全策略文件(我写的服务器用的是9999端口),那么好吧,我就在此处给客户端返回了一个安全策略文件信息,此文件格式如下:

<?xml version="1.0"?>

<cross-domain-policy>

    <site-control permitted-cross-domain-policies="all"/>

    <allow-access-from domain="localhost" to-ports="9999,300-400" />

</cross-domain-policy>

上述示例中是允许来自localhost域的swf文件访问9999端口和300至400端口,你也可以用*来代替localhost以允许来自任何域的swf文件访问。

此时我将客户端文件请求的信息在Java中打印出来,看到的是一段包含<policy-file-request/>的字符串,当Java服务器接收到这个字符串时,立即返回安全策略文件字符串。

我想这样应该没什么问题了吧,可是当我再连接服务器时仍然无法连接,输出信息成了这样:

-------------------------------------

[SWF] C:\Users\Administrator\Desktop\MyClientFlash.swf - 1112717 bytes after decompression

警告: 等待 socket 策略文件时在 xmlsocket://localhost:9999 上超时(3 秒钟)。这不会造成任何问题,但可访问 http://www.adobe.com/go/strict_policy_files_cn 以获得说明。

 

*** 安全沙箱冲突 ***

到 localhost:9999 的连接已停止 - 不允许从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 进行连接

错误: 拒绝请求位于 xmlsocket://localhost:9999 的资源(请求者从 file:///C|/Users/Administrator/Desktop/MyClientFlash.swf 发出请求),原因是缺乏策略文件权限。

-------------------------------------

这时我并不灰心,就按照它的说明去了http://www.adobe.com/go/strict_policy_files_cn这里查看说明了。

等我看到这个页面时,我真的郁闷了,上面全是乱说一通,根本不着边,全是一些没用的信息,亏Adobe想得出来提示我到这里看。

就 在我将要放弃解决这个问题的时候,我发现了另外一个现象,那就是当我刚开始连接服务器时,服务器端并没有打印出来客户端的请求信息 (<policy-file-request/>),而是在Flash CS3的调试器输出了超时错误之后,服务器端才打印出来这个请求信 息。

这时我看到了一线希望,那就是服务器端确实出现了等待,这肯定是服务器端的程序问题。服务器端接收请求的处理代码片断如下:

BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));

if(br.readLine().indexOf("<policy-file-request/>")!=-1){

//开始返回授权文件信息

...

}

其中变量s是ServerSocket实例通过accept方法获得的Socket实例。

此时我开始怀疑是readLine方法的问题了,因为readLine方法是当程序读到\n或者\r时才会返回信息,所以肯定是此方法中出现了等待,因为起初客户端并没有传来换行符或者回车符。

于是我改变了读取字符串的方法,不再用readLine了,而取流中前22个字符,代码片断如下所示:

BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));

char[] ch=new char[22];

br.read(ch, 0, ch.length);

StringBuffer sb=new StringBuffer();

for(int i=0;i< ch.length;i++){

sb.append(ch[i]);

}

String st=sb.toString();

if(st.indexOf("<policy-file-request/>")!=-1){

//开始返回授权文件信息

...

}

当我再连接服务器时,果然不出我所料,成功连接服务器。

但是连接过程有点慢,貌似此过程也正好是3秒钟,莫非在连接此服务器之前已经进行了另外一次连接,而且是失败的。

查看Adobe官网的资料才明白,flashplayer会在连接指定的端口之前连接目标主机的843端口,如果3秒后得不到授权文件才再向指定的端口去请求授权文件,如果再经过3秒还得不到授权文件的话,则断开连接,抛出securityError。

那 意思就是说在连接我的服务器的9999端口之前还连接了我的服务器的843端口,并且在843端口等待了3秒,没有得到授权文件,之后开始向我指定的端口 请求此授权文件。那好吧,既然你要了,我就给你吧,不给你的话你还再磨矶磨矶,于是我又在843端口开了一个ServerSocket,此处专门处理授权 文件的请求。

这时我再连接服务器,呵呵,特快专列(T843),立即就连接上了。

说明:貌似有很多客户机上的843端被禁用了,所以为了保险,需要在指定端口和843端都要能够处理授权文件的请求。

示例程序及源文件下载:点击下载此文件

在家上网赚钱更容易

分享到:
评论
1 楼 chenyuan122912 2012-05-16  

相关推荐

    flash cs5 最新帮助 查询文档 chm

    AS3提供了try...catch语句来捕获和处理错误,同时,使用trace()函数和Flash的内置调试工具可以帮助开发者定位和解决问题。 总结,Flash CS5的ActionScript 3提供了强大的编程功能,无论是初学者还是经验丰富的...

    flashactionscript3.0从入门到精通光盘内容

    《FlashActionScript3.0从入门到...总之,《FlashActionScript3.0从入门到精通》的光盘内容是你学习ActionScript 3.0不可或缺的资源,通过实践和探索,你将能够掌握这个强大的工具,创造出令人惊叹的Flash应用和游戏。

    ACTIONSCRIPT 3.0

    《ACTIONSCRIPT 3.0:深入理解与应用》 ...通过深入学习和实践,开发者可以利用AS3创建出令人惊叹的视觉效果和功能丰富的应用程序。随着技术的不断进步,ACTIONSCRIPT 3.0将继续在数字媒体创作中扮演关键角色。

    actionscript 3.0 射击游戏

    《ActionScript 3.0 射击游戏开发详解》 ActionScript 3.0 是Adobe Flash平台上用于创建交互式内容和动画的主要编程语言,尤其在游戏...通过学习和实践,开发者可以利用这些工具和技术创造出令人印象深刻的游戏体验。

    Flash11开发帮助文档

    文档详细介绍了AS3的基本语法、类库、对象模型以及面向对象编程概念。开发者可以学习如何创建类、继承、封装和多态,以及如何利用强大的数据类型系统来实现更复杂的程序逻辑。 二、Flash Player新特性 Flash 11...

    ActionScript教程

    ActionScript是一种基于ECMAScript的脚本语言,主要用于Adobe Flash平台,它在Web早期的动态内容和交互式应用开发中扮演了重要...通过深入学习和不断实践,你将能够运用ActionScript创建出令人惊叹的Flash交互体验。

    FLASH脚本的编写方法及基本脚本的使用

    ActionScript 3.0(AS3)是目前最广泛使用的版本,它提供了更强大的性能和更严谨的面向对象编程特性。 **一、ActionScript的基础概念** 1. 变量:存储数据的地方,如`var myVariable = "Hello, World!";` 2. 数据...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    flex游戏开发

    对于MMORPG(大型多人在线角色扮演游戏)等需要实时网络通信的游戏类型,Flex通过Java Socket或AS3 Socket提供了强大的网络通信能力。通过建立Socket连接,游戏客户端可以与服务器进行数据交换,实现多人在线对战等...

    Flashmx Action

    通过深入学习和实践,开发者可以利用其强大的功能来满足各种创意和功能需求,创造出令人惊叹的数字体验。无论是初学者还是经验丰富的开发者,都应重视ActionScript的学习,因为它是打开Flash开发世界的一把钥匙。

Global site tag (gtag.js) - Google Analytics