玩了一下 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 那边,该怎么做还是怎么做。