ActionScript接收socket服务器发送来的数据
原文地址:http://www.asp119.com/news/2009522181815_1.htm
從socket中接收數(shù)據(jù)的方法取決于你使用socket類型,Socket和XMLSocket都可以接收數(shù)據(jù),但是兩者實(shí)現(xiàn)方法有些不同,讓我們先看看Socket類是如何做的。
正如前面所講到的,Flash提供的socket通信方式是異步通信,也就是說僅僅創(chuàng)建socket連接并試圖讀取數(shù)據(jù)這是不可能的,read方法讀取數(shù)據(jù)時并不會等待數(shù)據(jù)傳輸過來而立即返回,如果數(shù)據(jù)還沒準(zhǔn)備好而去讀取數(shù)據(jù)會導(dǎo)致異常。
當(dāng)數(shù)據(jù)準(zhǔn)備好了時,socketData事件就會觸發(fā),通過注冊該事件處理函數(shù),當(dāng)數(shù)據(jù)發(fā)送過來時就會觸發(fā),因此可通過該處理函數(shù)讀取數(shù)據(jù)。
為了讀取服務(wù)器發(fā)送來的數(shù)據(jù),Socket類提供了一系列read方法來讀取不同類型的數(shù)據(jù),例如通過readByte( )方法讀取一個字節(jié),readUnsignedInt( )方法讀取一個無符號整數(shù),具體看下面的表格:
Table 24-1. Socket read methods for various datatypes
方法:返回類型描述字節(jié)數(shù)readBoolean():Boolean讀取布爾型數(shù)據(jù)1readByte():int 讀取一個字節(jié)數(shù)據(jù)1readDouble():Number讀取IEEE 754 雙精度浮點(diǎn)數(shù) 8readFloat():Number讀取IEEE 754單精度浮點(diǎn)數(shù) 4readInt():in 讀取32位整數(shù) 4readObject():* 讀取AMF格式對象NreadShort():int 讀取16位整數(shù) 2readUnsignedByte():uint讀取無符號字節(jié)1readUnsignedInt():uint 讀取無符號32位整數(shù)4readUnsignedShort():uint讀取無符號16位整數(shù) 2readUTF():String讀取UTF-8字符串n?
還有兩個方法沒有在上面的表格里,它們是readBytes( )和readUTFBytes( ),readBytes( )方法沒有返回值,它接受三個參數(shù):
bytes
一個flash.util.ByteArray 實(shí)例填充讀取的數(shù)據(jù)
offset
一個uint值指定讀取數(shù)據(jù)的偏移量,默認(rèn)為0
length
一個uint值表示讀取的字節(jié)數(shù),默認(rèn)為0,表示所有的數(shù)據(jù)
readUTFBytes( )方法只接受一個參數(shù),表示讀取的UTF-8字節(jié)數(shù),返回一個字符串。
下面的例子代碼連接一個socket服務(wù)器并讀取和顯示服務(wù)器發(fā)送的數(shù)據(jù):
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服務(wù)器發(fā)送"Hello"字符串,則輸出:
//Socket接收5字節(jié)的數(shù)據(jù):
72
101
108
108
111
?
Socket對象接收的數(shù)據(jù)都是ASCII編碼的文本,我們可以用readUTFBytes( )方法重新構(gòu)造字符串,readUTFBytes( )方法需要知道有多少個字節(jié)需要轉(zhuǎn)換,用bytesAvailable屬性指定字節(jié)數(shù):
var string:String = socket.readUTFBytes(socket.bytesAvailable);
XMLSocket類和Socket類基本類似,兩者都要注冊jian聽器檢測數(shù)據(jù)是否接收完畢,但是兩者讀取數(shù)據(jù)的方式是不同的。
當(dāng)數(shù)據(jù)準(zhǔn)備好時XMLSocket實(shí)例發(fā)出data事件,事件類型為flash.events.DataEvent.DATA ,它其中的data屬性包含接收過來的數(shù)據(jù)。
從服務(wù)器返回的數(shù)據(jù)都是原始的數(shù)據(jù),如果你希望以XML進(jìn)行處理則需先把數(shù)據(jù)轉(zhuǎn)換為XML 實(shí)例。
下面的代碼例子用XMLSocket連接本地服務(wù)器,端口為2900,連接成功后,發(fā)送<test>消息給服務(wù)器,onData事件處理函數(shù)處理服務(wù)器返回的數(shù)據(jù),返回?cái)?shù)據(jù)為<response><test success='true'/></response>,注意到該事件的data屬性的內(nèi)容只是字符串?dāng)?shù)據(jù),需用XML構(gòu)造器轉(zhuǎn)換位XML實(shí)例,最后通過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 來自于百度空間總結(jié)
以上是生活随笔為你收集整理的ActionScript接收socket服务器发送来的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装htop
- 下一篇: 08.self关键字