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返回策略文件 整个流程就没了?
回答补充
sunbright 2008/4/23 15:37:34
实际上加载跨域策略文件,就跟你平常使用socket一样,返回的数据也是一样,只是AS3 Socket在连接的时候,会自动发送请求跨域策略文件,Socket端只要像往常一样,当接收到这段字符串的时候,返回跨域策略文件给客户端就行了
sunbright 15:42:02
客户端只要代码是我所说的那样,那么客户端无须质疑,肯定没问题的,只是服务器端可能会有些问题曝出,当时我们在测试的时候,服务器端也是问题不断,当时也一直以为是我客户端做错了,后来经过调试,服务器端改正了好几次,终于把问题解决了
在加载跨域策略文件的时候,客户端没有太多的东西要做,因为该做的ADOBE已经帮你做好了,你需要做的只是连接,只要服务器端返回给你东西了,就连接上了,客户端没有什么东西可做的!!如果返回却没连接成功,请找服务器端的问题!