• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>FLASH AS 编程>AS基础篇>AS 3.0>文章内容
  • 针对flash player 9,0,124,0版本的连接socket返回跨域策略文件的问题
  • 来源:xiaos8.com 作者:sunbright 2008-05-02 【

4月23日补充更新,具体请看文章内容最下面

今天跟C服务器端进行socket连接调试,把这个问题给解决了,因此把做的过程中所得到的经验分享给大家!当然是基于客户端解说

注意:直接在flash中打开不会存在任何跨域问题,因此要想测试成功,得在通过IIS或者Apache等环境下测,当然我们也可以先模拟跨域请求

首先,咱们as3客户端,先写好socket连接相关代码,或者使用 ApplySocket类
需要通过IIS或者Apache等环境下测试的版本:
import index.base.net.ApplySocket;
import index.base.events.ApplySocketEvent;

var socket:ApplySocket = new ApplySocket();
socket.connect("192.168.1.5",9999);

socket.addEventListener(ApplySocketEvent.CONNECT,connectFun);
socket.addEventListener(ApplySocketEvent.SYNC,syncFun);

function connectFun(e:ApplySocketEvent):void{
  print("连接成功");
}

function syncFun(e:ApplySocketEvent):void{
  print(e.data as String);
}

function print(str:String){
  te.appendText(str + "\n");
}
在舞台上放一个命名为te的文本框,方便我们输出查看是否连接上
如果抛出了错误,文本框没有显示链接成功,那么表示失败;反之成功!

服务器端的做法:
当客户端连接socket的时候,会自动发送字符串"<policy-file-request/>",服务端需要判断接收到该字符串的时候,返回下面这段字符串:
<cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>
解释:domain是允许访问的域名,比如你允许了www.xiaos8.com下面的域名请求该socket,那么www.xiaos8.com以外域下的都无法连接该socket,"*"表示所有!
to-ports是允许访问服务器的端口号,比如你允许了9999端口,那么连接的不是9999端口,都无法连接上,"*"表示所有!
另外可以有多个子节点来描述策略文件;to-ports可以如这种形式编写8510-8523,表示这个范围内。

模拟环境下进行测试:
首先看代码:
import index.base.net.ApplySocket;
import index.base.events.ApplySocketEvent;

var socket:ApplySocket = new ApplySocket();
socket.connect("192.168.1.5",9999);

socket.addEventListener(ApplySocketEvent.CONNECT,connectFun);
socket.addEventListener(ApplySocketEvent.SYNC,syncFun);

function connectFun(e:ApplySocketEvent):void{
  trace("连接成功");
  socket.send("<policy-file-request/>");
}

function syncFun(e:ApplySocketEvent):void{
  trace(e.data as String);
}

//输出:
//连接成功
//<cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>
因为在flash中直接运行,是没有跨域的问题的,可以直接连接成功
自动发送的<policy-file-request/>,其实它和你用socket传输数据原理是一样的
那么在连接上之后,我们只需要调用ApplySocket的send方法,发送该字符串,显示一下接收的数据,如果是返回我们需要的东西,那么就对了,然后在放到公网上测试一下,即可!

如何?是否掌握的呢?不懂还是老规矩,跟帖问吧!!对于关于ApplySocket某些方法不明白是什么意思的,请参考 http://www.xiaos8.com/article.asp?id=105

==================== 气 死 你 的 分 割 线 ====================

4月23日补充更新:
此文章一出,并出现了多位朋友加我好友,来询问细节问题。
对于大家的问题,我做个汇总:
一、
问题1
爱护狐狸 2008/4/23 15:34:24
服务器向我返回字符串:
<cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>
应该是怎么写入的,是不是用utfBytes编码?服务器是java语言
回答1
不用你写入,只要服务器端返回给你,客户端会自动接收,并且连接成功,一般编码都是用UTF-8
二、
问题2
爱护狐狸 2008/4/23 15:38:33
那对flash play以前的版本的兼容……我还需要自己去下载策略文件吗?
回答2
sunbright 2008/4/23 15:38:46
不需要了
sunbright 2008/4/23 15:39:12
以前的版本,其实也可以这样做,但是也可以下载策略文件,这次的更新只是规定了,必须这样做
三、
问题3
ProgramerFMS12:04:39
整个流程就是 FLASH接上server后 自动请求 然后server返回策略文件 整个流程就没了?
回答3
sunbright12:04:49
回答补充
sunbright 2008/4/23 15:37:34
实际上加载跨域策略文件,就跟你平常使用socket一样,返回的数据也是一样,只是AS3 Socket在连接的时候,会自动发送请求跨域策略文件,Socket端只要像往常一样,当接收到这段字符串的时候,返回跨域策略文件给客户端就行了

sunbright 15:42:02
客户端只要代码是我所说的那样,那么客户端无须质疑,肯定没问题的,只是服务器端可能会有些问题曝出,当时我们在测试的时候,服务器端也是问题不断,当时也一直以为是我客户端做错了,后来经过调试,服务器端改正了好几次,终于把问题解决了

在加载跨域策略文件的时候,客户端没有太多的东西要做,因为该做的ADOBE已经帮你做好了,你需要做的只是连接,只要服务器端返回给你东西了,就连接上了,客户端没有什么东西可做的!!如果返回却没连接成功,请找服务器端的问题!
您的评论
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)