• ActionScript接收socket服务器发送来的数据


    原文地址:http://www.asp119.com/news/2009522181815_1.htm

    从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可以接收数据,但是两者实现方法有些不同,让我们先看看Socket类是如何做的。

    正如前面所讲到的,Flash提供的socket通信方式是异步通信,也就是说仅仅创建socket连接并试图读取数据这是不可能的,read方法读取数据时并不会等待数据传输过来而立即返回,如果数据还没准备好而去读取数据会导致异常。

    当数据准备好了时,socketData事件就会触发,通过注册该事件处理函数,当数据发送过来时就会触发,因此可通过该处理函数读取数据。

    为了读取服务器发送来的数据,Socket类提供了一系列read方法来读取不同类型的数据,例如通过readByte( )方法读取一个字节,readUnsignedInt( )方法读取一个无符号整数,具体看下面的表格:

    Table 24-1. Socket read methods for various datatypes

    方法:返回类型 描述 字节数
    readBoolean():Boolean 读取布尔型数据 1
    readByte():int 读取一个字节数据 1
    readDouble():Number 读取IEEE 754 双精度浮点数 8
    readFloat():Number 读取IEEE 754单精度浮点数 4
    readInt():in 读取32位整数 4
    readObject():* 读取AMF格式对象 N
    readShort():int 读取16位整数 2
    readUnsignedByte():uint 读取无符号字节 1
    readUnsignedInt():uint 读取无符号32位整数 4
    readUnsignedShort():uint 读取无符号16位整数 2
    readUTF():String 读取UTF-8字符串 n

    还有两个方法没有在上面的表格里,它们是readBytes( )和readUTFBytes( ),readBytes( )方法没有返回值,它接受三个参数:

    bytes

    一个flash.util.ByteArray 实例填充读取的数据

    offset

    一个uint值指定读取数据的偏移量,默认为0

    length

    一个uint值表示读取的字节数,默认为0,表示所有的数据

    readUTFBytes( )方法只接受一个参数,表示读取的UTF-8字节数,返回一个字符串。

    下面的例子代码连接一个socket服务器并读取和显示服务器发送的数据:

    package {

    import flash.display.Sprite;

    import flash.events.ProgressEvent;

    import flash.net.Socket;

    public class SocketExample extends Sprite {

    private var socket:Socket;

    public function SocketExample( ) {

    socket = new Socket( );

    // Listen for when data is received from the socket server

    socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );

    // Connect to the server

    socket.connect( "localhost", 2900 );

    }

    private function onSocketData( event:ProgressEvent ):void {

    trace( "Socket received " + socket.bytesAvailable + " byte(s) of data:" );

    // Loop over all of the received data, and only read a byte if there

    // is one available

    while ( socket.bytesAvailable ) {

    // Read a byte from the socket and display it

    var data:int = socket.readByte( );

    trace( data );

    }

    }

    }

    }

    上面的例子中,如果socket服务器发送"Hello"字符串,则输出:

    //Socket接收5字节的数据:

    72

    101

    108

    108

    111

    Socket对象接收的数据都是ASCII编码的文本,我们可以用readUTFBytes( )方法重新构造字符串,readUTFBytes( )方法需要知道有多少个字节需要转换,用bytesAvailable属性指定字节数:

    var string:String = socket.readUTFBytes(socket.bytesAvailable);   //c#发送代码为:byte[] msgBuffer = System.Text.Encoding.UTF8.GetBytes(serverMsg);

    XMLSocket类和Socket类基本类似,两者都要注册jian听器检测数据是否接收完毕,但是两者读取数据的方式是不同的。

    当数据准备好时XMLSocket实例发出data事件,事件类型为flash.events.DataEvent.DATA ,它其中的data属性包含接收过来的数据。

    从服务器返回的数据都是原始的数据,如果你希望以XML进行处理则需先把数据转换为XML 实例。

    下面的代码例子用XMLSocket连接本地服务器,端口为2900,连接成功后,发送<test>消息给服务器,onData事件处理函数处理服务器返回的数据,返回数据为<response><test success='true'/></response>,注意到该事件的data属性的内容只是字符串数据,需用XML构造器转换位 XML实例,最后通过E4X 语法输出XML:

    package {

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.events.DataEvent;

    import flash.net.XMLSocket;

    public class SocketExample extends Sprite {

    private var xmlSocket:XMLSocket;

    public function SocketExample( ) {

    xmlSocket = new XMLSocket( );

    // Connect listener to send a message to the server

    // after we make a successful connection

    xmlSocket.addEventListener( Event.CONNECT, onConnect );

    // Listen for when data is received from the socket server

    xmlSocket.addEventListener( DataEvent.DATA, onData );

    // Connect to the server

    xmlSocket.connect( "localhost", 2900 );

    }

    private function onConnect( event:Event ):void {

    xmlSocket.send( "<test/>" );

    }

    private function onData( event:DataEvent ):void {

    // The raw string returned from the server.

    // It might look something like this:

    // <response><test success='true'/></response>

    trace( event.data );

    // Convert the string into XML

    var response:XML = new XML( event.data );

    // Using E4X, access the success attribute of the "test"

    // element node in the response.

    // Output: true

    trace( response.test.@success );

    }

    }

    }

  • 相关阅读:
    【BZOJ 3709: [PA2014]Bohater】
    清北学堂2019.8.10 & 清北学堂2019.8.11 & 清北学堂2019.8.12
    清北学堂2019.8.9
    清北学堂2019.8.8
    清北学堂2019.8.7
    清北学堂2019.8.6
    【洛谷T89379 【qbxt】复读警告】
    【洛谷T89353 【BIO】RGB三角形】
    【洛谷T89359 扫雷】
    【洛谷P2016战略游戏】
  • 原文地址:https://www.cnblogs.com/niaowo/p/2158048.html
Copyright © 2020-2023  润新知