以下轉載自神魂顛倒

[3]
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
方法:返回值類型         描述         字節數
readBoolean( ):Boolean         從Socket讀取壹個Boolean值.         1
readByte( ):int         從Socket讀取壹個byte值.         1
readDouble( ):Number         從Socket讀取壹個IEEE 754雙精度浮點數.         8
readFloat( ):Number         從Socket讀取壹個IEEE 754單精度浮點數.         4
readInt( ):int         從Socket讀取壹個有符號32-bit整數值.         4
readObject( ):*         從Socket讀取壹個AMF-encoded對象.         n
readShort( ):int         從Socket讀取壹個有符號16-bit整數值.         2
readUnsignedByte( ):uint         從Socket讀取壹個無符號字節.         1
readUnsignedInt( ):uint         從Socket讀取壹個無符號32-bit整數         4
readUnsignedShort( ):uint         從Socket讀取壹個無符號16-bit整數.         2
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服務器,讀取並顯示每次從服務器發來的數據.
復制內容到剪貼板代碼:

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( eventrogressEvent ):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 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的更多詳細信息,我們需要另外討論.)
復制內容到剪貼板代碼:

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( eventataEvent ):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 );
    }
  }
}
註意:在data事件分發數據之前,XMLSocket實例必須從服務器收到壹個表示為空的byte('\\0').也就是說,從服務器僅僅只發送所需要的字符串是不夠的,必須在結尾處加入壹個表示為空的byte.

arrow
arrow
    全站熱搜

    阿酷 發表在 痞客邦 留言(0) 人氣()