0
点赞
收藏
分享

微信扫一扫

AS3 Socket 通信基础(一)


我们先来搞清几个概念,这有助于我们更加了解网络通信!
  1、网络中进程之间如何通信?
   首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
   2、什么是Socket?
   上面我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。
   socket一词的起源:在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:“命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。”计算机历史博物馆补充道:“这比BSD的套接字接口定义早了大约12年。”
   ---------------------------------------------------------------------分割线----------------------------------------------------------------
   好了,下面来讲讲AS3中的Socket编程。
   我们在使用ActionScript3.0进行Socket编程的时候需要关注下面的问题,我们将在今后的学习中逐个对下面的问题进行讨论,并尽量逐渐的改进我们的程序.
   1.与Socket服务器建立连接. 
   2.向Socket服务器发送数据. 
   3.从Socket服务器读数据. 
   4.同Socket服务器进行握手,并确定收到了什么样的数据和如何处理这些数据. 
   5.与Socket服务器断开,或者当服务器想与你断开的时候发消息给你. 
   6.处理使用Sockets时候引发的错误. 

   1.与Socket服务器建立连接. 
   我们通过调用Socket.connect( )或者XMLSocket.connect( )方法并监听网络连接的事件消息.
    连接一台Socket服务器你需要确定两个信息,一个是Socket服务器的域名或者IP地址,另一个是服务器监听的端口号. 
     无论你使用的是Socket还是XMLSocket类的实例,连接请求都是完全的一样的,两个类都是使用一个名叫connect()的方法,该方法有两个参数: 
host : 
     该参数为字符串类型,可以是一个域名,例如"www.example.com",也可以是一个IP地址,例如"192.168.1.101".如果Socket服务器与你该Flash影片发布的Web服务器是同一个,该参数为Null.
port : 
     该参数为一个表示Socket服务器监听端口的int值.该值最小为1024.除非在服务器中有一个policy文件,用于指定允许端口号小于1024. 

     因为Flash Socket编程是一个异步的过程,connect()方法不会等到一个连接完成后再执行下一行代码的执行.如果你想在一个连接完全执行完之前与一个Socket完全绑定,那么你将会得到一个意想不到的结果,并且你当前的代码将不能工作.
     在尝试一个新的Socket连接的时候我们最好先添加一个连接事件监听器.当一个连接建立成功,Socket或者XMLSocket会发出一个连接事件,这就可以让你知道交互已经准备好了.
     下面举了一个Socket实例与本地Socket服务器的2900端口建立连接的例子:


1. package { 
2. flash.display.Sprite; 
3.    import flash.events.*; 
4.    import flash.net.Socket; 
5. 
6.    public class SocketExample extends Sprite { 
7. 
8.      private var socket:Socket; 
9. 
10.      public function SocketExample(   ) { 
11.        socket = new Socket(   ); 
12.      
13.        // Add an event listener to be notified when the connection 
14.        // is made 
15.        socket.addEventListener( Event.CONNECT, onConnect ); 
16.      
17.        // Connect to the server 
18.        socket.connect( "localhost", 2900 ); 
19.      } 
20.    
21.      private function onConnect( event:Event ):void { 
22.        trace( "The socket is now connected..." ); 
23.      } 
24.    
25.    } 
26. }


复制代码


如果你想通过XMLSocket与服务器建立连接代码也是基本一样的.首先你创建了一个连接事件监听器,然后调用connect()方法.所不同的是Socket实例改为了XMLSocket:


1. package { 
2.    import flash.display.Sprite; 
3.    import flash.events.*; 
4.    import flash.net.XMLSocket; 
5. 
6.    public class SocketExample extends Sprite { 
7. 
8.      private var socket:XMLSocket; 
9. 
10.      public function SocketExample(   ) { 
11.        socket = new XMLSocket(   ); 
12.      
13.        // Add an event listener to be notified when the connection is made 
14.        socket.addEventListener( Event.CONNECT, onConnect ); 
15.      
16.        // Connect to the server 
17.        socket.connect( "localhost", 2900 ); 
18.      } 
19.    
20.      private function onConnect( event:Event ):void { 
21.        trace( "The xml socket is now connected..." ); 
22.      } 
23.    
24.    } 
25. }

复制代码


如果连接失败,可能是下面两种原因的一种:一种是连接立即失败和运行时错误,另一种是如果无法完成连接从而产生一个ioError或者securityError事件.关于错误事件处理信息的描述,我们打算改日讨论.
     请牢记,当与一个主机建立一个Socket连接时,Flash Player要遵守如下安全沙箱规则. 
     1.Flash的.swf文件和主机必须严格的在同一个域名,只有这样才可以成功建立连接. 
     2.一个从网上发布的.swf文件是不可以访问本地服务器的. 
     3.本地未通过认证的.swf文件是不可以访问任何网络资源的. 
     4.你想跨域访问或者连接低于1024的端口,必须使用一个跨域策略文件. 

     如果尝试连接未认证的域或者低端口服务,这样就违反了安全沙箱策略,同时会产生一个securityError事件.这些情况都可以通过使用一个跨域策略 文件解决.无论是Socket对象还是XMLSocket对象的策略文件,都必须在连接之前通过使用 flash.system.Security.loadPolicyFile()方法载入策略文件.具体如下:
     Security.loadPolicyFile("http://www.rightactionscript.com/crossdomain.xml");
     获得的改策略文件不仅定义了允许的域名,还定义了端口号.如果你不设置端口号,那么Flash Player默认为80端口(HTTP协议默认端口).在<allow-access-from>标签中可以使用逗号隔开设置多个端口号.下 面这个例子就是允许访问80和110端口.

<?xml version="1.0"?> 

<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy> 
   <allow-access-from domain="*" to-ports="80,110" /> 
</cross-domain-policy>


下节给下第二步:向Socket服务器发送数据.

举报

相关推荐

0 条评论