问题:
在研究《Flash游戏编程教程》的游戏实例《冲出重围》的时候,直接运行客户端和socket服务程序后,游戏可以正常运行。但是将flash文件发布成网页后,拷贝和修改crossdomain.xml文件,并将相关文件放在IIS根目录下进行运行,游戏将无法继续进行。采用其他监视工具查看,服务器端会收到<policy-file-request/>的错误消息。
原因:
在Adobe Flash Player升级到9.0.124后,由于安全策略的更改,使得在socket或xmlsocket的应用里,原先如用http方式加载安全策略的手段不能继续使用了,类似此类应用必须使用xmlsocket://方式来提供安全策略。
分析:
Flashplayer的安全策略检测过程如下:
1,首先检测目标服务器的843端口是否提供安全策略。
2,如果1没有检测到策略,则检测actionscript是否使用了Security.loadPolicyFile(xmlsocket://) 手段提供安全策略,如果还没检测到,则使用第3步检测。
3,检测目标服务器目标端口是否提供安全策略。
如果上述检测都不成功,则socket或xmlsocket则拒绝连接目标服务器。
解决方法:
根据以上的分析,有3种方式的解决方案
方法一:
在游戏服务器绑定843端口,当监听到请求后转发安全策略,就发送以下安全策略内容:
<cross-domain-policy><site-control permitted-cross-domain-policies=/"all/"/><allow-access-from domain=/"xxx.com/" to-ports=/"8999/" /></cross-domain-policy>/0
记得后面加上/0,不然FLASH会以为数据没有接收完。一切OK。
官方也提供了在具体的服务器环境下配置的方法,较繁琐。
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
方法二:
在Flash客户端的XmlSocket派生类中使用了Security.loadPolicyFile(“xmlsocket://www.xxx.com:port”) 手段,即是加入提供安全策略的服务器地址。(当然它也可以跟游戏服务器是同一台机器,大型的游戏架构应该有专门的这种服务器吧,因为它也可以起到负载平衡的作用)提供安全策略的服务器转发的内容应该和方法一的内容一致。
方法三:
当游戏服务器接受socket绑定时,向客户端发送安全策略内容。本人直接修改了教程提供的服务器端程序,运行游戏,一切OK,在此提供链接。
修改过的相关类
完整的解决方案
游戏运行界面:
讨论:
问题1:问什么游戏实例在没有发布成网页时可以正常运行,发布后却不行了?
答:查看里面的Messager代码发现,它加载服务器安全策略的方法:Security.loadPolicyFile("127.1.1.1/crosadomain.xml");你会发现它不是"http://"或"xmlsocket:"的方式。游戏实例通讯采用的是xmlsocket的方式,所以它必须使用socket的方式去获取策略内容。"http://"方式在FlashPlayer9.0以前是支持的,但是9.0以上版本就不支持了,本人也测试过"http"的方式来获取策略内容,确实是不起作用。除非你的游戏是基于http的方式进行设计,但是客户端必须依靠轮询的方式去获取数据,这种方式太多缺陷了,已经慢慢给淘汰了。
问题2:大型web游戏是如何部署策略文件的?
答:大型web游戏在设计上如有可能,应该考虑尽量支持多个FlashPlay版本,它在虚拟目录上应该有crosadomain.xml策略文件,也就是说它支持旧版的http方式获取和socket方式获取。偶也不是游戏公司,今天到“坦克大作战”那里测试了下,果然可以下载到这个文件。具体的架构需要专业人士解答,哈哈