AS3使用SOCKET遇到的安全沙箱问题

相信大家在进行AS3的SOCKET开发时都会遇到安全沙箱问题。ADODE也可以说是用心良苦,当我写AS3的SOCKET的代码时可以说跟C#,JAVA的SOCKET操作没什么两样,代码很快就完成了。服务端采用C#开发,本地测试时,完全正常。
但是当部署到网页上时,问题出来了
[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错误,郁闷
无意中,打开了机房里的另外一台服务器,结果返回的数据竟然一切正常。见了鬼了
此时可以确定程序和布署都是正常的,只是跟网络环境有莫大的关系
于是我在网上进行了狂搜 "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
通过抓包,可以很清楚的发现连接过程

主要代码如下:
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#端口监听
 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, 01024, 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     }
posted on 2009-10-10 01:45  aspdotnet  阅读(4298)  评论(9)    收藏  举报