国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > WEB開發(fā) > 正文

24.3.接收數(shù)據(jù)

2024-04-27 13:47:00
字體:
供稿:網(wǎng)友
問題
我想接收socket服務(wù)器發(fā)送來的數(shù)據(jù)

解決辦法
對(duì)于Socket實(shí)例可通過ProgressEvent.SOCKET_DATA事件處理函數(shù)中讀取數(shù)據(jù),可用readByte( )或readInt( )方法

對(duì)于XMLSocket實(shí)例可通data事件處理函數(shù)中讀取XML數(shù)據(jù)

討論
從socket中接收數(shù)據(jù)的方法取決于你使用socket類型,Socket和XMLSocket都可以接收數(shù)據(jù),但是兩者實(shí)現(xiàn)方法有些不同,讓我們先看看Socket類是如何做的。

正如前面所講到的,Flash提供的socket通信方式是異步通信,也就是說僅僅創(chuàng)建socket連接并試圖讀取數(shù)據(jù)這是不可能的,read方法讀取數(shù)據(jù)時(shí)并不會(huì)等待數(shù)據(jù)傳輸過來而立即返回,如果數(shù)據(jù)還沒準(zhǔn)備好而去讀取數(shù)據(jù)會(huì)導(dǎo)致異常。

當(dāng)數(shù)據(jù)準(zhǔn)備好了時(shí),socketData事件就會(huì)觸發(fā),通過注冊(cè)該事件處理函數(shù),當(dāng)數(shù)據(jù)發(fā)送過來時(shí)就會(huì)觸發(fā),因此可通過該處理函數(shù)讀取數(shù)據(jù)。

為了讀取服務(wù)器發(fā)送來的數(shù)據(jù),Socket 類提供了一系列read 方法來讀取不同類型的數(shù)據(jù),例如通過readByte( )方法讀取一個(gè)字節(jié),readUnsignedInt( )方法讀取一個(gè)無符號(hào)整數(shù),具體看下面的表格:
Table 24-1. Socket read methods for various datatypes
方法:返回類型描述 描述字節(jié)數(shù) 字節(jié)數(shù)
readBoolean():Boolean 讀取布爾型數(shù)據(jù) 1
readByte():int 讀取一個(gè)字節(jié)數(shù)據(jù) 1
readDouble():Number 讀取IEEE 754雙精度浮點(diǎn)數(shù) 8
readFloat():Number 讀取IEEE 754單精度浮點(diǎn)數(shù) 4
readInt():in 讀取32位整數(shù) 4
readObject():* 讀取AMF格式對(duì)象 N
readShort():int 讀取16位整數(shù) 2
readUnsignedByte():uint 讀取無符號(hào)字節(jié) 1
readUnsignedInt():uint 讀取無符號(hào)32位整數(shù) 4
readUnsignedShort():uint 讀取無符號(hào)16位整數(shù) 2
readUTF():String 讀取UTF-8字符串 n

還有兩個(gè)方法沒有在上面的表格里,它們是readBytes( )和readUTFBytes( ),readBytes( )方法沒有
返回值,它接受三個(gè)參數(shù):
bytes
一個(gè)flash.util.ByteArray 實(shí)例填充讀取的數(shù)據(jù)
offset
一個(gè)uint值指定讀取數(shù)據(jù)的偏移量,默認(rèn)為0
length
一個(gè)uint值表示讀取的字節(jié)數(shù),默認(rèn)為0,表示所有的數(shù)據(jù)
readUTFBytes( )方法只接受一個(gè)參數(shù),表示讀取的UTF-8 字節(jié)數(shù),返回一個(gè)字符串。
下面的例子代碼連接一個(gè)socket服務(wù)器并讀取和顯示服務(wù)器發(fā)送的數(shù)據(jù):
+展開
-ActionScript
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對(duì)象接收的數(shù)據(jù)都是ASCII編碼的文本,我們可以用readUTFBytes( )方法重新構(gòu)造字符串,readUTFBytes( )方法需要知道有多少個(gè)字節(jié)需要轉(zhuǎn)換,用bytesAvailable屬性指定字節(jié)數(shù):
+展開
-ActionScript
var string:String = socket.readUTFBytes(socket.bytesAvailable);

XMLSocket類和Socket類基本類似,兩者都要注冊(cè)監(jiān)聽器檢測(cè)數(shù)據(jù)是否接收完畢,但是兩者讀取數(shù)據(jù)的方式是不同的。

當(dāng)數(shù)據(jù)準(zhǔn)備好時(shí)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:
+展開
-ActionScript
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 );
}
}
}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武山县| 梅河口市| 漳州市| 蓬安县| 伽师县| 佛冈县| 平远县| 吉水县| 都匀市| 灌阳县| 墨玉县| 镇安县| 普兰县| 札达县| 平顶山市| 孟津县| 凤翔县| 南部县| 明水县| 九龙城区| 乌兰浩特市| 昌都县| 凤凰县| 广河县| 淮北市| 桃江县| 民乐县| 阿图什市| 莱阳市| 泸溪县| 固安县| 阳原县| 邯郸市| 天台县| 阳信县| 射洪县| 盱眙县| 马龙县| 留坝县| 麻江县| 桃园市|