AS3: Socket 數據包 收 發

AS3.0 中使用Socket使用tcp服務器協議,它是一種流協議,不停的將分片傳輸給客戶端,P作爲流,發包是不會整包到達的,而是源源不斷的。 它不同於UDP服務器協議,UDP作爲數據包協議,整包到達。 如果要使用Socket接收數據我們必須使用ProgressEvent.SOCKET_DATA事 件。這個事件在幫助文檔中是這樣描述的 ——在套接字接收到數據後調度。 而事實卻並非如此,做過一次嘗試,服務器發送了20000次數據而 rogressEvent.SOCKET_DATA事件只產生了2000多次。 那麼爲什麼說"服務器發送了20000次數據而 rogressEvent.SOCKET_DATA事件只產生了2000多次", 因爲flash socket使用的TCP/IP協議, 這個協議跟UDP不同,它不是以單個"包"的形式發送數據,它發送的是"流數據",所以即便你發來20000次數據(也就是你所想象的20000個 包),TCP協議也是將它視作"流"發送. 換句話說,你的20000次數據,實際上只被分割成了2000多個"包"來發送,因此socket收 到了2000多個包,,因此只產生了2000多次的事件. 另外,如果as3 的data事件函數正在執行的時候,比如在此函數中用while循環解碼,此時有新的數據發送過來,data事件還會觸發麼?觸發的話,正在執行的怎麼 辦?原有數據還有麼? 答案是會觸發的,所以將socket數據read的時候,必須做一個循環 while,每到一個包剛好讀取完成的時候(包頭用一個整型記錄完整包的長度。每次都先讀取一個包長度,然後按照包長度讀取指定長度的數據作爲一個完整數 據包傳遞到到邏輯層),又繼續讀取下一個包,然後把解碼後的每個包都放進一個數組裏面依次讀取。還有一點要注意的是 socket.bytesAvailable長度是每read一次就減去所讀的長度,直至讀取完畢,最後爲0;此處的bytesAvailable如果重 新設置position爲0,那該數組的bytesAvailable又是滿的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章