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讀取布爾型數據1readByte():int 讀取一個字節數據1readDouble():Number讀取IEEE 754 雙精度浮點數 8readFloat():Number讀取IEEE 754單精度浮點數 4readInt():in 讀取32位整數 4readObject():* 讀取AMF格式對象NreadShort():int 讀取16位整數 2readUnsignedByte():uint讀取無符號字節1readUnsignedInt():uint 讀取無符號32位整數4readUnsignedShort():uint讀取無符號16位整數 2readUTF():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);
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 );
}
}
}
收藏于 2011-05-24 來自于百度空間總結
以上是生活随笔為你收集整理的ActionScript接收socket服务器发送来的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装htop
- 下一篇: 08.self关键字