socket服务器解决843端口策略文件的问题

本文记录了一次关于FlashPlayer在网络请求时的安全沙箱错误问题排查经历。重点介绍了如何正确配置跨域策略文件crossdomain.xml及解决自建socket服务器时遇到的策略文件加载问题。

记录一下帮人看问题的时候踩的一个坑。

flash player在进行网络请求时需要先确认是否配置策略文件,如果加载不到或没有对应权限,则会报错安全沙箱错误。


如果是http服务器,则要在根目录下配置crossdomain.xml文件。若需要修改策略文件加载地址,则对应client代码为Security.loadPolicyFile(“ http://www.xxx.com/crossdomain.xml ”)


这次主要是测试自建的socket服务器。用AIR写了一个简易的服务器观察过程。

Server: 监听了843端口和一个自定义的端口(13468)

Client 使用socket连接。测试时不能在flash中测试运行,应发布swf后,直接在flash player环境中运行。

在调用socket.connect后,服务端首先在843端口收到一条字符串信息 <policy-file-request/>

若不处理或返回内容错误,则会在自定义端口再次收到<policy-file-request/>

若仍不处理或返回错误,则client报错 SecurityError #2048

这个过程是在客户端发出请求时flash player 自动帮我们完成的。只有在收到了正确的策略文件信息后,客户端才会响应Event.CONNECT事件。


经过学习后知道client对应的策略检查代码为:

 Security.loadPolicyFile(“xmlsocket://www.xxx.com:port”)

可以注意到,这个策略文件的数据传输方式是基于xmlsocket的。


坑就在这里!

xmlsocket的数据传输需要在数据的末尾检测到'\0'(也就是ASCII码的0),才会认为数据接收结束。

AS3在字符串里写"\0"会直接解析成"0",也就失去了原本的意义。

只有写  var str:String = "xxxxx" + String.fromCharCode(0); 时,才是正确的在字符串结尾插入了一个ASCII码为0的字符


但!是!

悲催的在字符串转换成二进制的时候,这个好不容易加上的'\0'被自动忽略掉了。

于是才有了一下午的测试失败。因为在客户端那边,一直没收到这个结束字符,一直认为收到的数据不完整,策略文件配置自然不会生效。


来个原理测试图:



最终的解决办法,就是在843端口接到请求后,返回的数据转换为二进制以后,手动在数据的末尾加一个字节的0


好吧,最后处理起来确实很简单,但最重要的还是知道坑在哪,为什么是坑,对吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值