`
ch_kexin
  • 浏览: 897641 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

关于 AS3 Socket 通信基础(三)

 
阅读更多
3.从Socket服务器读数据 
        对于Socket实例,先收到socketData事件,然后调用如下两个方法的一个,比如,readByte()或者readInt(),在事件控制器中确定不会去读过去的bytesAvailable.
     对于XMLSocket实例,先收到data事件,然后解析从事件控制器内部装载的XML数据. 

     从一个socket连接接收的数据依赖于你使用的Socket的类型.socket和XMLSocket都可以从服务器接受到数据,但是它们处于不同重量级的技术.让我们在讨论XMLSocket之前先关注下Socket类.
     我都知道socket在Flash中是一个异步的行为.因此,它就不能简单的创建一个Socket连接,然后就立刻尝试去读取数据.read方法不能等到 从服务器传过来数据之后在返回.换句话说,你只能在客户端从服务器载入所有数据之后才可以读取数据.在数据可用之前读数据会产生一个错误.
     通过socketData事件广播到Socket实例,这样我们就可以知道什么时候数据可以被读取.那么我们要为socketData事件添加一个事件监 听器,任何时候只要有新的数据从一个socket服务器发送过来,都会触发事件控制器.在事件处理器的内部我们写入我们要执行的代码去读取和处理收到的数 据.
     从一个前端服务器读取数据,Socket类为我们提供了许多不同的方法,这些方法依赖于你所读得数据类型.例如,你可以通过readByte()方法读一 个byte数据,或者通过一个使用readUnsignedInt()方法去读一个无符号整数.下面这个表列出来能够从服务器读取的数据类型,返回值,和 read方法每次读入的字节数.

Table:Socket read methods for various datatypes
  1. 方法:返回值类型         描述         字节数 
  2. readBoolean( ):Boolean         从Socket读取一个Boolean值.         1 
  3. readByte( ):int         从Socket读取一个byte值.         1 
  4. readDouble( ):Number         从Socket读取一个IEEE 754双精度浮点数.         8 
  5. readFloat( ):Number         从Socket读取一个IEEE 754单精度浮点数.         4 
  6. readInt( ):int         从Socket读取一个有符号32-bit整数值.         4 
  7. readObject( ):*         从Socket读取一个AMF-encoded对象.         n 
  8. readShort( ):int         从Socket读取一个有符号16-bit整数值.         2 
  9. readUnsignedByte( ):uint         从Socket读取一个无符号字节.         1 
  10. readUnsignedInt( ):uint         从Socket读取一个无符号32-bit整数         4 
  11. readUnsignedShort( ):uint         从Socket读取一个无符号16-bit整数.         2 
  12. readUTF( ):String         从Socket读取一个一个UTF8字符串.         n
复制代码
有两个额外的方法没有在上面这个表中描述.它们分别是readBytes()和readUTFBytes().readBytes()方法只可以让socket读数据但不能返回一个值,并且该方法需要3个参数:

bytes: 
     一个flash.util.ByteArray实例读取从socket中收到的数据. 
offset: 
     一个uint值,指定从什么位置开始读取socket中收到数据的偏移量.默认值为0. 
length: 
     一个uint值,用于指定读取bytes的数量.默认值为0,意思就是说将所有的可用的数据都放入ByteArray中. 

     另一个readUTFBytes()方法,只需要一个长度参数用于指定UTF-8字节的读入数量,并且该方法会将所有读入的字节码转换成为字符串类型. 

注意:在从一个Socket读数据之前,首先要判断bytesAvailable的属性.如果你不知道要读入的数据类型是什么就去读数据的话,将会产生一个错误(flash.errors.EOFError).

     下面的例子代码连接了一个socket服务器,读取并显示每次从服务器发来的数据.
  1. package { 
  2.    import flash.display.Sprite; 
  3.    import flash.events.ProgressEvent; 
  4.    import flash.net.Socket; 
  5.    public class SocketExample extends Sprite { 
  6.      private var socket:Socket; 
  7.      public function SocketExample(   ) { 
  8.        socket = new Socket(   ); 
  9.      
  10.        // Listen for when data is received from the socket server 
  11.        socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData ); 
  12.        // Connect to the server 
  13.        socket.connect( "localhost", 2900 ); 
  14.      } 
  15.      private function onSocketData( eventrogressEvent ):void { 
  16.        trace( "Socket received " + socket.bytesAvailable + " byte(s) of data:" );
  17.        // Loop over all of the received data, and only read a byte if there 
  18.        // is one available 
  19.        while ( socket.bytesAvailable ) { 
  20.          // Read a byte from the socket and display it 
  21.          var data:int = socket.readByte(   ); 
  22.          trace( data ); 
  23.        } 
  24.      } 
  25.    } 
  26. }
复制代码
在上面的这个例子中,如果一个socket服务器发送回一个消息(例如"hello"),当一个客户段连入服务器就会返回并输出下面类似的文字: 

Socket received 5 byte(s) of data: 
72 
101 
108 
108 
111 

注意:一旦数据从socket读出,它就不能再次被读.例如,读一个字节之后,这个字节就不能再"放回来",只能读后边的字节. 

     当收到的数据为ASCII编码,你可以通过readUTFBytes()方法重新构建一个字符串.readUTFBytes()方法需要知道多少个字节需要转换为字符串.你可以使用bytesAvailable去读所有的字节数据:

var string:String = socket.readUTFBytes(socket.bytesAvailable); 

     XMLSocket类的动作和Socket类相比在从服务器接受数据的风格相似.两者都是通过事件监听器来监听数据接收通知的,这主要取决于Flash异步的Socket实现.然而,在处理实际数据的时候有很大的不同.

     有个XMLSocket实例在从服务器下载完数据后分发数据事件.通过flash.events.DataEvent.DATA常量定义的数据事件包含一个data属性,该属性包含了从服务器收到的信息.

注意:使用XMLSocket从服务器返回的数据总是认为是一个字符串类型的数据.这样不用为任何数据类型的数据指定读取方法. 
     这些从服务器返回的数据是没有经过任何处理的原始数据.因此,你不能通过XMLSocket连接立即使用XML,你发送和接收的都是纯字符串数据.如果你期望XML,在你处理数据之前,你必须首先将这些数据转换为一个XML的实例.
     下面的这段代码在初始化的时候通过XMLSocket连接到了本地服务器的2900端口.在连接成功之后,一个<test>消息会发送到服务 器.onData事件监听者控制从服务器返回的响应.在本例中返回字符串<response><test success='true'/></response>.你可以通过事件的data属性发现为字符串数据,然后XML类的构造函数将 字符串转换成为了XML实例.最后,通过使用E4X语法的XML实例的一部分信息.(关于通过使用E4X处理XML的更多详细信息,我们需要另外讨论.)
  1. package { 
  2.    import flash.display.Sprite; 
  3.    import flash.events.Event; 
  4.    import flash.events.DataEvent; 
  5.    import flash.net.XMLSocket; 
  6.    public class SocketExample extends Sprite { 
  7.      private var xmlSocket:XMLSocket; 
  8.      public function SocketExample(   ) { 
  9.        xmlSocket = new XMLSocket(   ); 
  10.      
  11.        // Connect listener to send a message to the server 
  12.        // after we make a successful connection 
  13.        xmlSocket.addEventListener( Event.CONNECT, onConnect ); 
  14.      
  15.        // Listen for when data is received from the socket server 
  16.        xmlSocket.addEventListener( DataEvent.DATA, onData ); 
  17.        // Connect to the server 
  18.        xmlSocket.connect( "localhost", 2900 ); 
  19.      } 
  20.    
  21.      private function onConnect( event:Event ):void { 
  22.        xmlSocket.send( "<test/>" ); 
  23.      } 
  24.      private function onData( eventataEvent ):void { 
  25.        // The raw string returned from the server. 
  26.        // It might look something like this: 
  27.        // <response><test success='true'/></response> 
  28.        trace( event.data ); 
  29.      
  30.        // Convert the string into XML     
  31.        var response:XML = new XML( event.data ); 
  32.      
  33.        // Using E4X, access the success attribute of the "test" 
  34.        // element node in the response. 
  35.        // Output: true 
  36.        trace( response.test.@success ); 
  37.      } 
  38.    } 
  39. }
复制代码
注意:在data事件分发数据之前,XMLSocket实例必须从服务器收到一个表示为空的byte('\\0').也就是说,从服务器仅仅只发送所需要的字符串是不够的,必须在结尾处加入一个表示为空的byte.
分享到:
评论

相关推荐

    一段as3.0与c++socket通信的例子(as端代码)

    以下是一些关于AS3.0 Socket通信的关键知识点: 1. **创建Socket对象**: 首先,我们需要创建一个`Socket`对象实例,通过调用其构造函数指定服务器的IP地址和端口号。例如: ```as3 var socket:Socket = new ...

    java和as3 socket通信 解决安全沙箱问题

    Java和ActionScript 3 (AS3) 的Socket通信在实现跨平台交互时是常见的技术手段,尤其是在处理实时数据传输和游戏开发中。然而,由于AS3运行在Flash Player的沙箱环境中,它受到一系列安全限制,包括不能直接与非同一...

    FLASH AS3 SOCKET收发16进制示例

    `HEXtoString as3.as`这个文件可能包含一个函数,用于将16进制字符串转换为ByteArray,以便于Socket通信。 在AS3中,使用Socket类的步骤如下: 1. **创建Socket实例**:首先,你需要创建一个Socket对象,例如`var ...

    flash actionscript3 as3通信 教程 socket与服务器通信, 多个swf之间通信.zip

    flash actionscript3 as3通信 教程 socket与服务器通信, 多个swf之间通信.zip

    flash actionscript3游戏开发之as3的socket通信方式介绍即使用XMLSocket.zip

    本文将深入探讨AS3中的Socket通信方式,特别是利用XMLSocket进行网络交互的细节。 首先,XMLSocket是AS3中用于低级网络通信的类,它提供了双向、全双工的数据流,适合于游戏开发中的实时数据交换,如玩家状态同步、...

    as3socket通信

    as3socket向服务器传输数据和接收服务器的数据,自己,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

    flash as3 socket编程基础

    ### Flash AS3 Socket编程基础知识详解 #### 一、引言 在现代互联网应用开发中,实时通信技术变得越来越重要。而Socket编程作为一种实现客户端与服务器之间实时数据交换的有效手段,在Flash开发领域同样占据着重要...

    as3_Socket_的简单实例

    总之,AS3的`Socket`类提供了一种直接与远程服务器进行TCP通信的能力,适合于需要自定义协议或低级别控制网络通信的场景。通过学习和理解TCP/IP协议以及应用层协议如POP3,开发者可以利用`Socket`类构建功能丰富的...

    socket通信异常解决总结

    Socket 通信异常解决总结 Socket 通信异常是指在网络通信过程中出现的各种错误和异常,包括网络连接断开、服务器端或客户端程序异常、网络链路异常等。这些异常会导致 Socket 连接断开,影响系统的稳定性和可靠性。...

    as3_socket

    建立Socket连接是任何Socket通信的基础。在AS3中,我们可以使用`Socket`或`XMLSocket`类来创建Socket实例,并调用`connect()`方法来尝试与服务器建立连接。 1. **确定服务器信息**: - **域名/IP地址**:需要知道...

    全AIR 的 Socket通信(air服务端、air客户端)

    Socket通信是网络编程的基础,它提供了两台计算机之间低级别的双向通信通道。 首先,让我们理解Socket的基本概念。Socket是一种网络通信协议,允许两台计算机通过TCP/IP协议进行通信。在AIR中,我们可以使用AS3的...

    AS3 Socket 基础知识(很全面) 1

    AS3 Socket基础知识是网络通信的重要组成部分,特别是在网络时代,它被广泛应用于各种应用程序中,因为“一切皆Socket”。网络进程间的通信需要一个唯一标识,TCP/IP协议族通过IP地址识别网络主机,结合传输层的...

    Flex 的socket通信

    这个文件可能是一个AS3脚本,包含了具体的Socket通信逻辑,如创建Socket对象、设置事件监听器等。 通过以上知识点,你可以理解并实现Flex中的Socket通信。实例代码如`ScoketClient.mxml`和`mySocket`可以帮助你更...

    AS3使用Socket的简单例子.txt

    - **AS3 Socket编程基础** - **创建与配置XMLSocket对象** - **事件监听器的设置与使用** - **连接服务器及发送数据** - **接收服务器响应** #### 知识点详细解析 ##### AS3 Socket编程基础 ActionScript 3.0 ...

    (AS3)socket+客户端与服务端+实例

    本文将深入探讨基于ActionScript 3(AS3)的Socket通信,包括客户端与服务端的交互,以及如何通过提供的实例来理解这一过程。我们将不涉及具体代码,而是详细解释相关的概念和技术要点。 首先,Socket是网络编程中...

    Flex_AS3与Java的Socket通信

    在本文中,我们将深入探讨Flex AS3与Java的Socket通信技术,这是一种允许Web应用程序(如Flash游戏)与服务器进行低级数据传输的方法。Flex AS3是Adobe开发的ActionScript 3.0编程语言的一个框架,它提供了丰富的...

    as3-java socket

    本文将深入探讨“as3-java socket”这个主题,这是关于使用ActionScript 3(AS3)与Java进行Socket通信的一个测试程序。AS3是Adobe Flash Platform的主要编程语言,而Java Socket API则是用于实现网络上的双向通信的...

    as3与java简单socket交互demo

    **AS3中的Socket通信** AS3是Adobe开发的脚本语言,主要用于Flash和Flex应用。在AS3中,我们可以使用`flash.net.Socket`类来建立TCP Socket连接。以下是一些关键知识点: 1. **初始化Socket对象**:首先,我们需要...

Global site tag (gtag.js) - Google Analytics