`
ch_kexin
  • 浏览: 875575 次
  • 性别: 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.
分享到:
评论

相关推荐

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

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

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

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

    as3socket通信

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

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

    一段as3.0写的客户端代码,用来监听服务器端和发送数据用的一个例子。可作参考。socket通信

    Flex_AS3与Java的Socket通信

    Flex的AS3与Java的Socket通信

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

    NULL 博文链接:https://renzaihangzhou.iteye.com/blog/2007855

    php与flash as3 socket通信传送文件实现代码

    前段时间在flashseer看到有人提到:可以通过socket方式传送swf文件,让用户无法获取到swf文件… 当时还没有出as3的反编译,所以对程序的保护没有在意.随着反编译程序的平民化,不希望别人看到源代码的朋友就比较着急… ...

    as3-java socket

    as3与java 进行socket通信的测试程序。

    VB Socket 异步通信框架代码.rar

    VB Socket 异步通信框架代码,'数据包的长度  Public Const SFJ_Pro_SegmentLength As Integer = 1024  '数据包的数据长度部分占字节位数  Public Const SFJ_Pro_Packet_DataLen_Byte_Num As Integer = 8  '...

    as socket详解

    as socket详解,全面了解ActionScript Socket 与后台通信机制

    一个可以做AS3的前后端通信脚本

    NULL 博文链接:https://as3.iteye.com/blog/938093

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

    就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。上面我们已经知道网络中

    socket异步通信框架

    Protected Overrides Sub HandleStringData(ByVal handler As Socket, ByVal operate As Integer, ByVal data As String) End Sub Protected Overrides Sub OnEndSendEvent(ByVal handler As Socket, ByVal ...

    socket通信.rar

    import tkinter as tk import threading data='' sock1=socket.socket(socket.AF_INET,socket.SOCK_STREAM) host = '127.0.0.1' port = 1234 sock1.bind((host,port)) sock1.listen(128) print("服务器等待连接中......

    多个flash互相通信demo

    多个flash之间互相通信demo,socket编程,flash as3

    php+as socket实例

    这是用php写的socket服务器,再加上as写的socket客户端进行的通信,里面有源码,有注释,有说明文档。实现了简单的socket创建,绑定,监听socket连接及关闭,接受消息,发送消息,关闭socket连接等功能。

    Socket实现两台计算机间的简单通信

    此代码实现了服务器端与客户端不同电脑间的网络通信,基于TCP协议,服务器端启动后,客户端搜索进行连接,连接成功后,进行通信。里面我根据自己的理解进行相应的注释,在启动客户端的方法中,将ip地址更改为本机ip...

    unity hololens socket demo

    应粉丝要求,应用之前的通信协议和socket组件,做了一个简单的通信demo。socket模块已经在hololens模拟器上测试通过、完全兼容。压缩包提供的服务器是as3写的,如果需要源代码可以联系我索取。我觉得懂as3的已经不多...

Global site tag (gtag.js) - Google Analytics