« 让 Make 递归所有子目录 | 返回首页 | 关于“群”的那些破事 »

玩了一下 ActionScript

周末。

玩了一下 ActionScript 。因为感觉做一些简单的需要长连接的互联网应用,flash 是一个不错的选择。在大多数情况下,比要求用户安装一个客户端要人性。(当然,和要求用户为浏览器安装一个莫名其妙的 ActiveX 控件相比,让用户自己决定是否下载独立客户端要友好的多)

因为,虽然 Flash 大多数情况下作为一个浏览器插件(在 Windows 下是一个 ActiveX 控件)的形式存在,但其安全性比之许多绿霸之流的流氓软件还是值得信任的。

身边的同事没有人做过 flash 的应用。周末里,也不好意思的打搅那些做 web game 组的同事。所以我只好求助于 google 以及 adobe 的官方网站,花了几个小时时间,稍微摸出点门道来。

我想我是患上了 IDE 恐惧症。一开始搜出的信息是,开发基于 Flash 的网络应用程序,需要在 Adobe 出品的 Flash CS 中工作。我在网上找来几张这个 IDE 的截图就被吓坏了。这是给我这样愚笨的程序员用的吗?离开了命令行、管道这些东西,我写的代码还能被编译运行吗?我不想把生命浪费在拖拽控件、寻找菜单等等的鼠标操作上。

继续搜索,找到两个东西:

一个是 MTASC ,第三方开源项目,可以用来编译 ActionScript 2 的代码。

另一个是 Adobe 自己 Flex SDK ,可以用来编译 ActionScript 3 。

比较了一下 as 2 和 as3 的语法,很明显,as3 更像是设计出来的语言,虽然写起来比 as2 冗长许多。不过我想,as3 更有前途。所以选择了 Flex SDK 里带的 mxmlc 做我的编译器。

btw, 在 Ubuntu 下安装 MTASC 更为方便,用 apt 即可。随手装了一个,感觉编译速度快很多,有空的话,我也多玩一下。


我想试一下,如果用 as3 创建一个长连接跟 server 通讯。搜索的结果是,使用 flash.net.Socket 或是 flash.net.XMLSocket 。

两个差不太多,不过 Socket 可以用 raw binary 的协议,和我以前做的东西跟贴切。所以我用 flash.net.Socket 做的实验。

Socket 类采用的是回调机制,注册一些事件回调去相应网络消息即可。在 Adobe 的官方文档上找到了例子程序,编译通过。(注:如果使用 mxmlc 编译,需要加上编译开关 -use-network)

然后,我用 nc 架了个简单的 server 做测试。

第一次握手,可耻的失败鸟。nc 收到了一个字符串,“policy-file-request” 然后就被 Client 关掉。

从字面上猜想,这个是 Flash 的安全设施之一,保障 flash 程序挂在 web 上,可以让人更安全的使用。比如,你不能做个 web 页面,放个 flash 在上面,骗别人去浏览,然后用这个 flash 程序去访问一些本来不该你可以访问的服务。

举个例子:如果是你发布一个客户端程序,让用户运行,你可以用这个客户端收集用户机器上的资料,并发回 server ,用户是很难知道的(尤其在 Windows 下)。这点,Flash 可以用本地文件访问的限制控制。

如果你的客户端程序去连接用户本地网络(原本是用防火墙阻止外部连接),用户也很可能在不知情的情况下,泄露一些不应该泄露的信息。Flash 作为一个公众安装量极大的 web 控件,必须考虑这类安全问题。

Flash 的安全解决方案就是,在建立任何网络连接时,先询问 server 自己是否有权限建立连接。也就是自我约束。

为了让我的程序可以正常工作,我在 Adobe 的网站上找到了详细说明

接下来,随手写了几十行 C 程序提供这个 policy-file-request 服务。我的第一个 as3 程序就可以正确的和 server 通讯了。

剩下来的工作,和别的语言/开发环境下做互联网应用基本没有区别:接收包,分析包、处理包。

Flash 在处理 UI 方面还是很强大的,所以搭建一个诸如聊天室,或者是让一个 sprit 在虚拟场景里跑,并同步各个 client 的位置信息都是很容易的事情。

用 Flash 做所谓“无端网游" 大抵如此。只不过把用 C/C++ 写的东西搬到 as3 里做罢了。至于 Server 那边,该怎么做还是怎么做。

Comments

看懂了。呵呵。

资料没找到,google倒是吧我带来云风大哥的blog了。其实有个Alchemy的东西很y有意思的。云风大哥又兴趣可以去看看....

长连接的 flash 游戏后端是 C / C++ /Java
不需要长连接的 flash 游戏 php 就够了而且速度快

as3中纯写代码,我用了aswing.

服务器我一个人根本做不下来,我就用DB的存储过程实现第3层功能.用xml来传数据.

一直在看您的博客,获益匪浅。
我正在用Flash做类似的开发,我个人比较看好ActionScript3在网游方面的开发。从我自己的角度来谈几点体会:

ActionSctipt 为动态地 Game Object Model提供了一个极好的实现环境。因为swf本身可以看作一个封装了程序逻辑的视觉对象。而flash.display.Loader 提供了良好的预载机制。

ActionScript 3提供了一个足够强大的渲染环境,flash.display.* 而且性能不错。你之前提到的矢量碰撞遮罩在Flash中非常轻易的可以实现。

Flash Player支持高性能的AMF二进制数据包装格式,处理多人游戏数据的效率非常高。

哈哈 云风也是用拼音输入法哈 经常选错字

十年。云风兄风采依旧

呵呵,终于看到一篇能够看懂的文章了...^_^

能不能跟网易泡泡组反映下,那个网易泡泡程序图标能不能换下啊,这么长时间一直用那个巨傻无比的图标!

silverlight靠着.net这个大山,一点也不示弱啊。

AS2和AS3要比较的不是语法问题。而是AS3运行在FlashPlayer的AVM2上,不论是语法还是内在性能都提高了。
AS2太那个了,没必要的话千万不要用。
我觉得flash在躲在浏览器里局限太多了,浏览器限制着它性能,安全限制也很多。个人比较喜欢air

@cloud,
是的,policy-file的重要功能就是安全。我所说的限制内容的跨域请求也不仅仅是DDOS一种,在这一点上我和你的理解是一致的。
UI正是Flash最核心的竞争力,as3可以说是为此而生。至于性能优化,不妨看看Adobe Alchemy这项直接编译C/C++到SWF的技术,虽然比传统C要慢10倍左右,但优于as3脚本很多。

@QiZhi,

我觉得防止 DDOS 攻击只是 policy-file 的功能之一。

不过 socket 或 xmlsocket 的 policy-file 并不是用于文件请求的。

可能你把它和 URL policy file 混淆了。它们公用了相同的语法。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e08.html

如果只是为了防止 DDOS 攻击,对
policy-file 本身的请求也是避免不了的。

我的理解,安全方面的因素要更多一些。这和 w3c 标准里,html 页面不得跨域访问是一样的。(不能用javascipt 去取到别的域下的 web 页面的内容,因为那可能侵犯用户的隐私)

关于policy-file您理解错了。policy-file主要是限制内容的跨域请求。试想某站某文件被全球的flash播放器请求会出现什么局面...-use-network参数也是这个意思,因为flash player限制local沙箱不允许访问web环境的内容。

AS2的pitfall很多。。我觉得能不用就不要用了

“Flash 的安全解决方案就是,在建立任何网络连接时,先询问 server 自己是否有权限建立连接。也就是自我约束。”
这种安全机制有意义吗……汗

感觉FLEX很有前途。。。M$的SilverLight虽然技术上更先进,不过据说是因为反垄断的原因没能大力推广。。。

抱歉,尺寸是指什么最终显示的分辨率之类的东西 …… 不是容量上的。譬如说用 Flex 编译出来的 SWF,用浏览器打开。拖动浏览器的尺寸,最大化,全屏什么的 …… 会有惊喜

可以用 FlexBuilder 来做 AS 应用。不过其实不用 FlashCS 来做应用程序的话,控制最终的尺寸就需要 Web 设计方面的同事来帮忙 ……

FlashCS 对于偶这种非专业程序员来说,做东西很享受

随手拈来,的解是强。云风什么时候发几张新的工作照来等大家欣赏一下你的风采

Post a comment

非这个主题相关的留言请到:留言本