相信大家在进行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 >
通过抓包,可以很清楚的发现连接过程
![](http://www.mobans.cn/attachment/blog/as3socket.jpg)
主要代码如下:
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 }
转载请注明出处:http://www.mobans.cn/