flex与PHP.Socket通信的安全策略问题.

      上周在研究PHP的socket,建好以后用telnet连得上,但是每次用FLEX连接都弹安全沙箱.后来烦了2天才弄好这个问题. 在这里小结一下:
      php的socket建立网上不少.但是与flex通信的就沒几个..后面我会把代码放上来.
      FLEX的外部连接经常会遇到安全沙箱的问题,主要是跨域访问资源的权限.也就是访问策略文件:crossdomain.xml:
      <?xml version="1.0"?>
      <cross-domain-policy>
                <allow-access-from domain='*' to-ports='*' />
      </cross-domain-policy>
      元策略是放在域名的根目录下:
      <?xml version="1.0"?>   
      <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">   
            <cross-domain-policy> 
                <site-control permitted-cross-domain-policies="all" />    
                <allow-access-from domain="*" />    
                <allow-http-request-headers-from domain="*" headers="*"/>  
            </cross-domain-policy>
      具体请看:
      Adobe 官方说明 中文版.

      写了策略文件以后 FLEX就会搜索域名或当前位置的策略文件 如果找不到 就会以XMLsocket 方式 request 服務器843 端口. 如果还是没有.就会访问当前端口的策略文件. 这次还没有的话就抛出安全沙箱错误了..
      可是.... 我在项目里 在项目目录和 域名根目录都弄好了crossdomain.xml FLEX依然一直报错,于是,我从843端口下手.开了一个843端口的SOCKET,监听传过来的request,如果是FLEX傳的,就返回一個策略文件給FLEX. PHP代碼:
      if(strpos($buf,'policy-file-request')){
      $msg ="<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>";
      socket_write($msgsock, $msg."\0", strlen($msg."\0"));
      成功了! 但是只有第1次..第2次就会提示策略文件语法错误.经过我的调试后,发现SOCKET的内容还保存着..也就是策略文件输出了2次,格式当然不对了..在PHP里又找不到像FMS那样清理缓存内容的东西.只能放弃..
      后来,在网上找到一篇教程才弄好.方法是在php的Socket端口里写策略文件 ,但是返回的是给单一的客户端.
      PHP文件:
      文件下载
      至於FLEX端的話,连socket不是什麽难题...看看手册就行了,我也不放上来了.希望能帮上还在为安全沙箱苦恼的各位. 
posted @ 2009-09-30 15:05  reuyui  阅读(1804)  评论(0编辑  收藏  举报