AS3使用SOCKET遇到的安全沙箱问题
相信大家在进行AS3的SOCKET开发时都会遇到安全沙箱问题。ADODE也可以说是用心良苦,当我写AS3的SOCKET的代码时可以说跟C#,JAVA的SOCKET操作没什么两样,代码很快就完成了。服务端采用C#开发,本地测试时,完全正常。
但是当部署到网页上时,问题出来了
网上查了一些资料,说的也是很清楚,当FLASH的SOCKET进行连接时会到843端口进行请求策略文件,于是我就在C#中添加了一段对843端口的监听,VS.NET 2008也很快捕捉到了830端口有SOCKET连接,接着返回策略文件。接着访问SOCKET的连接端口。
似乎开发起来很顺利
接着道服务端进行部署。把FLASH网页文件放到域名http://youname.com/chat/下,然后开启服务端的各个端口进行监听,本地打开进行测试,问题接着就来了,本地死活都是连接不上去。饭后错误任然是
结果在显示对服务器的端口843进行连接时都是正常的,本地发送<policy-file-request/>\0,服务端返回策略文件内容
无意中,打开了机房里的另外一台服务器,结果返回的数据竟然一切正常。见了鬼了
此时可以确定程序和布署都是正常的,只是跟网络环境有莫大的关系
于是我在网上进行了狂搜 "as3 socket 843 端口 3秒"等关键词,呵呵。
呵呵,看样子,大家都没有碰到这种情况,难道,还是我的程序有问题
接着我是到各大相关论坛进行发贴求教,回复的也是不少,我也是谢了一大堆,可惜没有什么新意,都是网上流传那几招
时隔一天,我已经有点放弃了,无意中在FLASH8看到了一篇文章,http://space.flash8.net/bbs/viewthread.php?tid=370600&highlight=socket
似乎有所收获,由于目前的FLASH版本基本都己经升到了flash 10,对策略文件的部署也是相当的严格,不通过843端口,另外可以通过 详情见:http://www.mobans.cn/flash/1089.html
Security.loadPolicyFile("xmlsocket://mysite.com:port"),进行部署,两外等待策略文件的时间也是足够的放宽
接着进行修改代码,进行测试,出了碰到了点小的插曲,在测试的过程中,连接的端口改了,但是策略文件里的端口没有修改,导致结果还是没有连接上,但是我在测试的同时却进行了抓包,还好没有错过这次机会。抓包软件上已经发现本地对目标端口进行了请求。
呵呵,这下子好办了。接着一翻风顺,只是对843端口进行等待的时间,连接慢了3秒
看样子网上的文章虽多,但是有大量的文章没有区别
Security.loadPolicyFile("xmlsocket://mysite.com:port")和
Security.loadPolicyFile("xmlsocket://mysite.com:port")
为了说明问题,我用上面的方法进行设置
Security.loadPolicyFile("xmlsocket://202.101.172.*:844")
采用上面的策略文件
通过抓包,可以很清楚的发现连接过程

主要代码如下:
AS3部分
但是当部署到网页上时,问题出来了
[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
看提示就知道是安全沙箱问题。网上查了一些资料,说的也是很清楚,当FLASH的SOCKET进行连接时会到843端口进行请求策略文件,于是我就在C#中添加了一段对843端口的监听,VS.NET 2008也很快捕捉到了830端口有SOCKET连接,接着返回策略文件。接着访问SOCKET的连接端口。
似乎开发起来很顺利
接着道服务端进行部署。把FLASH网页文件放到域名http://youname.com/chat/下,然后开启服务端的各个端口进行监听,本地打开进行测试,问题接着就来了,本地死活都是连接不上去。饭后错误任然是
[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]
把抓包工具打开,进行抓包分析。结果在显示对服务器的端口843进行连接时都是正常的,本地发送<policy-file-request/>\0,服务端返回策略文件内容
<cross-domain-policy>
<allow-access-from domain="*" to-ports="8888" />
</cross-domain-policy>
显示正常,但是过了许久,还是返回ERR 2048错误,郁闷<allow-access-from domain="*" to-ports="8888" />
</cross-domain-policy>
无意中,打开了机房里的另外一台服务器,结果返回的数据竟然一切正常。见了鬼了
此时可以确定程序和布署都是正常的,只是跟网络环境有莫大的关系
于是我在网上进行了狂搜 "as3 socket 843 端口 3秒"等关键词,呵呵。
呵呵,看样子,大家都没有碰到这种情况,难道,还是我的程序有问题
接着我是到各大相关论坛进行发贴求教,回复的也是不少,我也是谢了一大堆,可惜没有什么新意,都是网上流传那几招
时隔一天,我已经有点放弃了,无意中在FLASH8看到了一篇文章,http://space.flash8.net/bbs/viewthread.php?tid=370600&highlight=socket
似乎有所收获,由于目前的FLASH版本基本都己经升到了flash 10,对策略文件的部署也是相当的严格,不通过843端口,另外可以通过 详情见:http://www.mobans.cn/flash/1089.html
Security.loadPolicyFile("xmlsocket://mysite.com:port"),进行部署,两外等待策略文件的时间也是足够的放宽
接着进行修改代码,进行测试,出了碰到了点小的插曲,在测试的过程中,连接的端口改了,但是策略文件里的端口没有修改,导致结果还是没有连接上,但是我在测试的同时却进行了抓包,还好没有错过这次机会。抓包软件上已经发现本地对目标端口进行了请求。
呵呵,这下子好办了。接着一翻风顺,只是对843端口进行等待的时间,连接慢了3秒
看样子网上的文章虽多,但是有大量的文章没有区别
Security.loadPolicyFile("xmlsocket://mysite.com:port")和
Security.loadPolicyFile("xmlsocket://mysite.com:port")
为了说明问题,我用上面的方法进行设置
Security.loadPolicyFile("xmlsocket://202.101.172.*:844")
采用上面的策略文件
<cross-domain-policy>
<allow-access-from domain="*" to-ports="8888" />
</cross-domain-policy>
监听的端口是8888<allow-access-from domain="*" to-ports="8888" />
</cross-domain-policy>
通过抓包,可以很清楚的发现连接过程

主要代码如下:
AS3部分
public class Main extends Sprite
{
private var socket:Socket = new Socket();
public function Main():void
{
Security.allowDomain("*");
Security.loadPolicyFile("xmlsocket://202.91.*.*:844");
this.socket.addEventListener(Event.CONNECT, function(e:Event):void {
this.SendChat("socket data");
});
this.socket.addEventListener(ProgressEvent.SOCKET_DATA, function(e:ProgressEvent):void {
trace("有数据");
});
this.socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(e:SecurityErrorEvent):void {
trace(e.text);
});
this.socket.connect("202.91.*.*", 8888);
}
private function SendChat(s:String):void
{
if (s.length == 0) {
return;
}
var buffer:ByteArray = new ByteArray();
buffer.writeMultiByte(s, "GBK");
trace(buffer.length);
this.socket.writeUnsignedInt(buffer.length);
this.socket.writeBytes(buffer, 0, buffer.length);
this.socket.flush();
}
}
c#端口监听{
private var socket:Socket = new Socket();
public function Main():void
{
Security.allowDomain("*");
Security.loadPolicyFile("xmlsocket://202.91.*.*:844");
this.socket.addEventListener(Event.CONNECT, function(e:Event):void {
this.SendChat("socket data");
});
this.socket.addEventListener(ProgressEvent.SOCKET_DATA, function(e:ProgressEvent):void {
trace("有数据");
});
this.socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(e:SecurityErrorEvent):void {
trace(e.text);
});
this.socket.connect("202.91.*.*", 8888);
}
private function SendChat(s:String):void
{
if (s.length == 0) {
return;
}
var buffer:ByteArray = new ByteArray();
buffer.writeMultiByte(s, "GBK");
trace(buffer.length);
this.socket.writeUnsignedInt(buffer.length);
this.socket.writeBytes(buffer, 0, buffer.length);
this.socket.flush();
}
}
1 public class AllowDomain
2 {
3 private TcpListener Server;
4 private AsyncCallback callback;
5 private bool islisten = false;
6
7 public AllowDomain()
8 {
9 this.Server = new TcpListener(844);
10 this.Server.Start();
11 this.callback = new AsyncCallback(this.OnConnectionEvent);
12 this.islisten = true;
13 this.Server.BeginAcceptSocket(this.callback, null);
14 }
15
16 public void Close()
17 {
18 this.islisten = false;
19 this.Server.Stop();
20 }
21
22 private void OnConnectionEvent(IAsyncResult syn)
23 {
24 if (this.islisten)
25 {
26 SocketError error;
27 Socket conn = this.Server.EndAcceptSocket(syn);
28 //conn.Send(PolicyFile.Policys);
29
30 byte[] buffer = new byte[1024];
31 int len = conn.Receive(buffer, 0, 1024, SocketFlags.None, out error);
32 if (error == SocketError.Success)
33 {
34 string s = Encoding.Default.GetString(buffer, 0, len);
35 if (s == "<policy-file-request/>\0")
36 {
37 buffer = Encoding.Default.GetBytes("<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8888\"/></cross-domain-policy>\0");
38 conn.Send(buffer);
39 }
40 }
41 conn.Close();
42 if (this.islisten)
43 this.Server.BeginAcceptSocket(this.OnConnectionEvent, null);
44 }
45 }
46 }
2 {
3 private TcpListener Server;
4 private AsyncCallback callback;
5 private bool islisten = false;
6
7 public AllowDomain()
8 {
9 this.Server = new TcpListener(844);
10 this.Server.Start();
11 this.callback = new AsyncCallback(this.OnConnectionEvent);
12 this.islisten = true;
13 this.Server.BeginAcceptSocket(this.callback, null);
14 }
15
16 public void Close()
17 {
18 this.islisten = false;
19 this.Server.Stop();
20 }
21
22 private void OnConnectionEvent(IAsyncResult syn)
23 {
24 if (this.islisten)
25 {
26 SocketError error;
27 Socket conn = this.Server.EndAcceptSocket(syn);
28 //conn.Send(PolicyFile.Policys);
29
30 byte[] buffer = new byte[1024];
31 int len = conn.Receive(buffer, 0, 1024, SocketFlags.None, out error);
32 if (error == SocketError.Success)
33 {
34 string s = Encoding.Default.GetString(buffer, 0, len);
35 if (s == "<policy-file-request/>\0")
36 {
37 buffer = Encoding.Default.GetBytes("<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8888\"/></cross-domain-policy>\0");
38 conn.Send(buffer);
39 }
40 }
41 conn.Close();
42 if (this.islisten)
43 this.Server.BeginAcceptSocket(this.OnConnectionEvent, null);
44 }
45 }
46 }
浙公网安备 33010602011771号