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

来源:互联网 发布:零件设计软件手机 编辑:程序博客网 时间:2024/06/01 09:00

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

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


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

阅读全文
0 0
原创粉丝点击