|
上周在研究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不是什麽难题...看看手册就行了,我也不放上来了.希望能帮上还在为安全沙箱苦恼的各位. |
|
|