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,  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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值