導航:首頁 > IDC知識 > as3socket伺服器

as3socket伺服器

發布時間:2021-02-20 16:57:12

1、as3 Socket 與伺服器怎麼交互

下個RED5吧?java寫的開源伺服器。。做聊天 根本沒問題。。我們還拿來做游專戲通信呢。。如果你要自己屬寫。那也可以。。那是伺服器的事。我不說。就說說Flex的socket吧。。創建一個socket對象 有幾個事件要添加。。太簡單不過了的。。查下幫助文檔嘛。。

2、as3.0 ByteArray,伺服器用socket發送了一個int level = 10;過來,客戶端應該是接收4個位元組的,

level = int(_soket.readUTFBytes(4)); ???

你確認服務端是將10做為int型二進制寫入嗎?是不是寫進去的是"10"的字元串?

3、flash socket伺服器有哪些

FLASH SOCKET在講AS3 Socket之前我們先來搞清幾個概念,這有助於我們更加了解網路通信!1、網路中進程之間如何通信?

首要解決的問題是如何唯一標識一個進程,否則通信無從談起!在本地可以通過進程PID來唯一標識一個進程,但是在網路中這是行不通的。其實TCP/IP協議族已經幫我們解決了這個問題,網路層的「ip地址」可以唯一標識網路中的主機,而傳輸層的「協議+埠」可以唯一標識主機中的應用程序(進程)。這樣利用三元組(ip地址,協議,埠)就可以標識網路的進程了,網路中的進程通信就可以利用這個標志與其它進程進行交互。使用TCP/IP協議的應用程序通常採用應用編程介面:UNIX BSD的套接字(socket)和UNIX System
V的TLI(已經被淘汰),來實現網路進程之間的通信。就目前而言,幾乎所有的應用程序都是採用socket,而現在又是網路時代,網路中進程通信是無處不在,這就是我為什麼說「一切皆socket」。2、什麼是Socket?上面我們已經知道網路中的進程是通過socket來通信的,那什麼是socket呢?socket起源於Unix,而Unix/Linux基本哲學之一就是「一切皆文件」,都可以用「打開open
–> 讀寫write/read –>
關閉close」模式來操作。我的理解就是Socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉),這些函數我們在後面進行介紹。
socket一詞的起源:在組網領域的首次使用是在1970年2月12日發布的文獻IETF
RFC33中發現的,撰寫者為Stephen Carr、Steve Crocker和Vint
Cerf。根據美國計算機歷史博物館的記載,Croker寫道:「命名空間的元素都可稱為套接字介面。一個套接字介面構成一個連接的一端,而一個連接可完全由一對套接字介面規定。」計算機歷史博物館補充道:「這比BSD的套接字介面定義早了大約12年。」--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------好了,下面來講講AS3中的Socket編程。我們在使用ActionScript3.0進行Socket編程的時候需要關注下面的問題,我們將在今後的學習中逐個對下面的問題進行討論,並盡量逐漸的改進我們的程序.
1.與Socket伺服器建立連接.
2.向Socket伺服器發送數據.
3.從Socket伺服器讀數據.
4.同Socket伺服器進行握手,並確定收到了什麼樣的數據和如何處理這些數據.
5.與Socket伺服器斷開,或者當伺服器想與你斷開的時候發消息給你.
6.處理使用Sockets時候引發的錯誤.
1.與Socket伺服器建立連接.
解決方法:

我們通過調用Socket.connect( )或者XMLSocket.connect(
)方法並監聽網路連接的事件消息.
討論:

連接一台Socket伺服器你需要確定兩個信息,一個是Socket伺服器的域名或者IP地址,另一個是伺服器監聽的埠號.

無論你使用的是Socket還是XMLSocket類的實例,連接請求都是完全的一樣的,兩個類都是使用一個名叫connect()的方法,該方法有兩個參數:
host
:

該參數為字元串類型,可以是一個域名,例如"www.example.com",也可以是一個IP地址,例如"192.168.1.101".如果Socket伺服器與你該Flash影片發布的Web伺服器是同一個,該參數為Null.
port
:

該參數為一個表示Socket伺服器監聽埠的int值.該值最小為1024.除非在伺服器中有一個policy文件,用於指定允許埠號小於1024.

因為Flash
Socket編程是一個非同步的過程,connect()方法不會等到一個連接完成後再執行下一行代碼的執行.如果你想在一個連接完全執行完之前與一個Socket完全綁定,那麼你將會得到一個意想不到的結果,並且你當前的代碼將不能工作.

在嘗試一個新的Socket連接的時候我們最好先添加一個連接事件監聽器.當一個連接建立成功,Socket或者XMLSocket會發出一個連接事件,這就可以讓你知道交互已經准備好了.

下面舉了一個Socket實例與本地Socket伺服器的2900埠建立連接的例子:
package {
import
flash.display.Sprite;
import flash.events.*;
import
flash.net.Socket;
public class SocketExample extends Sprite
{
private var socket:Socket;
public function
SocketExample( ) {
socket = new Socket( );

//
Add an event listener to be notified when the connection
// is
made
socket.addEventListener( Event.CONNECT, onConnect
);

// Connect to the server
socket.connect(
"localhost", 2900 );
}

private function onConnect(
event:Event ):void {
trace( "The socket is now connected..."
);
}

}
}

如果你想通過XMLSocket與伺服器建立連接代碼也是基本一樣的.首先你創建了一個連接事件監聽器,然後調用connect()方法.所不同的是Socket實例改為了XMLSocket:
package
{
import flash.display.Sprite;
import flash.events.*;

import flash.net.XMLSocket;
public class SocketExample extends Sprite
{
private var socket:XMLSocket;
public function
SocketExample( ) {
socket = new XMLSocket( );

// Add an event listener to be notified when the connection is made

socket.addEventListener( Event.CONNECT, onConnect );

//
Connect to the server
socket.connect( "localhost", 2900 );

}

private function onConnect( event:Event ):void {

trace( "The xml socket is now connected..." );
}

}
}

如果連接失敗,可能是下面兩種原因的一種:一種是連接立即失敗和運行時錯誤,另一種是如果無法完成連接從而產生一個ioError或者securityError事件.關於錯誤事件處理信息的描述,我們打算改日討論.

請牢記,當與一個主機建立一個Socket連接時,Flash
Player要遵守如下安全沙箱規則.
1.Flash的.swf文件和主機必須嚴格的在同一個域名,只有這樣才可以成功建立連接.

2.一個從網上發布的.swf文件是不可以訪問本地伺服器的.
3.本地未通過認證的.swf文件是不可以訪問任何網路資源的.

4.你想跨域訪問或者連接低於1024的埠,必須使用一個跨域策略文件.
如果嘗試連接未認證的域或者低埠服務,這樣就違反了安全沙箱策略,同時會產生一個securityError事件.這些情況都可以通過使用一個跨域策略
文件解決.無論是Socket對象還是XMLSocket對象的策略文件,都必須在連接之前通過使用
flash.system.Security.loadPolicyFile()方法載入策略文件.具體如下:
Security.loadPolicyFile("http://www.rightactionscript.com/crossdomain.xml");

獲得的改策略文件不僅定義了允許的域名,還定義了埠號.如果你不設置埠號,那麼Flash
Player默認為80埠(HTTP協議默認埠).在<allow-access-from>標簽中可以使用逗號隔開設置多個埠號.下
面這個例子就是允許訪問80和110埠.
<?xml version="1.0"?>
<!DOCTYPE
cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>

<allow-access-from domain="*" to-ports="80,110"
/>
</cross-domain-policy>
2.向Socket伺服器發送數據. 解決方法:
對於Socket對象來說,通過是用write方法(writeByte(),writeUTFBytes(
)等方法.)先向緩存區寫入數據,然後使用flush()方法發送數據.對於XMLSocket對象,使用send()方法.
討論:

Socket和XMLSocket類向Socket伺服器發送數據的方法是不相同的.讓我們首先看一下Socket類的方法.

當你使用Socket對象向伺服器發送數據的時候,你首先要將數據寫入到一個緩沖區中.Socket類設置了一系列的方法來寫數據.每一個方法都用於寫不
同的數據類型的數據(或者不同的數據).這些方法分別是: writeBoolean( ), writeByte( ), writeBytes( ),
writeDouble( ), writeFloat( ), writeInt( ), writeMultiByte( ), writeObject( ),
writeShort( ), write- UnsignedInt( ), writeUTF(), 和writeUTFBytes( ).
這些方法大多數都只接受一個參數,該參數的類型同方法的名字相匹配.例如,writeBoolean()方法接受一個布爾值作為參數,而 writeByte( ),
writeDouble( ), writeFloat( ), writeInt( ), writeShort( ), writeUnsignedInt( )
方法接受一個數字型參數.writeObject()方法接受一個對象類型作為參數,但該對象必須序列化成為AMF格式.writeBytes(
)方法允許你傳一個ByteArray參數,並帶有偏移量和長度兩個參數.例如,下面這段代碼,調用了一個writeBytes(
)方法,該方法將ByteArray對象中的所有byt值都傳出去了(偏移量為0,長度和ByteArray數組長度等長):
socket.writeBytes(byteArray,
0, byteArray.length);
writeUTF( )和writeUTFBytes( )
方法允許你的發送字元串類型的參數.每個一個方法只接受一個字元串作為參數.writeUTFBytes( )方法簡單的將字元串作為Bytes發送.writeUTF(
)方法在寫入真正數據之前,先寫入byts的數量.
writeMultiByte(
)方法也允許字元串類型的參數,但是使用的為非默認字元集.該方法需要兩個參數:字元串和字元集名稱.在Flash和Flex的幫助文檔中有一個自持所有
字元集的列表,該列表中的標簽和描述符是一一對應的.使用標簽值作為writeMultiByte(
)作為字元集.例如下面的代碼發送了一個編碼為Unicode的字元串:
socket.writeMultiByte("example",
"unicode");

向一個Socket對象傳數值的方法完全依賴於你所有數據的類型和服務所接受數據的類型.使用一個Socket對象,你完全可以使用
ActionScript寫一個Telnet和POP
mail客戶端.這兩種協議都支持ASCII字元指令.例如,在連接一個POP伺服器之後,你可以通過使用USER指令指定一個用戶.下面代碼向一個
Socket對象發一條指令:
// POP servers expect a newline (\n) to execute the
preceding command.
socket.writeUTFBytes("USER
exampleUsername\n");

向一個Socket對象寫入數據其實並沒有將數據發送到Socket伺服器.每調用一個write方法都向Socket對象添加一個數據.例如,下面代碼向一個Socket對象添加了四個byte的數據,但是沒有一個發出了.
socket.writeByte(1);
socket.writeByte(5);
socket.writeByte(4);
socket.writeByte(8);
當你想將這些累積的數據發送到Socket伺服器需要調用flush()方法.flush()方法調用之後將把所有已經寫入的數據發送出去,並清空緩沖區:
socket.flush(
);

XMLSocket類是一個非常簡單用於發送數據的API.寫於發數據都是由send()這一個方法來完成的.send()方法可以接受任何數據類型的參
數.它可以將所有的參數都轉換為一個字元串類型並發送到伺服器.通常參數為一個XML對象或者一個包含數據結構類似XML數據的字元串:
xmlSocket.send(xml);

然而,准確的格式完全依賴於伺服器所能夠接受的格式.如果伺服器接受XML格式的數據,你必須發送XML格式的數據.如果伺服器只接受URL編碼的數據,你也必須發送URL編碼的數據.
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.
4.同Socket伺服器進行握手,並確定收到了什麼樣的數據和如何處理這些數據. 解決方法:

創建不同的常量來聲明協議的狀態.使用這些常量將指定的處理函數映射到相應的狀態.在一個socketData事件控制器中,通過狀態映射調用這些函數的.
討論:

建立Socket連接通常要處理握手這個環節.尤其是在伺服器初始化需要向客戶端發送數據.然後客戶端通過一種特殊的方式相應這些數據,接著伺服器因此再次響應.整個處理過程直到握手完成並且建立起一個"正常的"連接為止.

處理伺服器的不同響應是非難的,主要的原因是socketData事件控制器不能保存上下文的順序.也就是說,伺服器的響應不會告訴你"為什麼"響應,
也不告訴你這些響應數據被那個處理程序來處理.要想知道如何處理這些從伺服器返回的響應不能從響應的本身來獲得,尤其在響應變化的時候.或許一個響應返回
了兩個位元組碼,另一個返回了一個整數值還跟了一個雙精度浮點數.這樣看來讓響應本身處理自己是一大難題.

我們通過創建一個狀態量來標注不同的上下文,伺服器通過這些上下文將數據發送到客戶端.與這些狀態量都有一個相關聯的函數來處理該數據,這樣你就可以很輕松的按照當前的協議狀態去調用正確的處理函數.
當你要與一個Socket伺服器建立連接需要考慮如下幾個步驟:
1.當與伺服器連接的時候,伺服器立刻返回一個標志伺服器可以支持的最高協議版本號的整數值.
2.客戶端在響應的時候會返回一個實際使用協議的版本號.
3.伺服器返回一個8byte的鑒定碼.
4.然後客戶端將這鑒定碼返回到伺服器.
5.如果客戶端的響應不是伺服器端所期望的,或者,就在這個時候該協議變成了一個常規操作模式,於是握手結束.

實際上在第四步可以在鑒定碼中包含更多的安全響應.你可以通過發送各種加密方法的密匙來代替逐個發送的鑒定碼.這通常使用在客戶端向用戶索要密碼的時候,
然後密碼成為了加密過的8byte鑒定碼.該加密過的鑒定碼接著返回到伺服器.如果響應的鑒定碼匙伺服器所期望的,客戶端就知道該密碼是正確的,然後同意 建立連接。
轉自C#.NET ASP.NET的空間。

4、flash as3 socket 斷開連接

兄弟,網頁上運行的flash要與socket伺服器連接,是要解決安全沙漏問題的,在伺服器上要單獨運一個版843埠的伺服器,提權供安全策略文件,就OK了,你百度一下flash運行的安全機制就知道了,我之前也遇到這個問題整了很久,網上很多說用JAVA或C++寫個843埠策略文件伺服器,後來我用AIR做了一個,解決問題,你可以到後面的參考資料里下載,我也提供了源文件,供大家研究!

5、As3.0 socket 連接問題

呃,socket client端就是這樣的。埠號每次都會自動增加。但是,這跟socket連接沒有影響。專我是用java做的服務端。屬對於服務端來說,每次的連接都會有一個線程,你只需要直接回復到該socket就可以了,怎麼會出現發送不了的情況呢。

6、怎麼用As3連接伺服器操作?

socket使用的例子,開源聊天室: http://code.google.com/p/as3chat/
SocketConnection.as:
package org.myleft.core
{
import flash.system.Security;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.events.TimerEvent;
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.utils.Timer;
import flash.xml.XMLDocument;
import flash.xml.XMLNode;

import org.myleft.data.Define;
import org.myleft.events.SocketConnectionEvent;

public class SocketConnection extends EventDispatcher
{
public var socket:Socket;
public var host:String;
public var port:int;

public var keepAlive:Timer;
private var lastSendTime:Number;

public function SocketConnection(target:IEventDispatcher=null)
{
super(target);
socket = new Socket;

socket.addEventListener(Event.CONNECT, socketEventFunction);
socket.addEventListener(Event.CLOSE, socketEventFunction);

socket.addEventListener(Event.ACTIVATE, socketEventFunction);
socket.addEventListener(IOErrorEvent.IO_ERROR, socketIOErrorEventFunction);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, );

socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataFunction);

keepAlive = new Timer(10000);
keepAlive.addEventListener(TimerEvent.TIMER, onKeepAliveLoop);

}

private function onKeepAliveLoop(evt:TimerEvent):void
{

//if((new Date().getTime() - lastSendTime > 15000))
if ( socket.connected ) {
this.sendKeepAlive();
}
else
{
keepAlive.stop();

var e:SocketConnectionEvent;
e = new SocketConnectionEvent(Define.CLOSE);
dispatchEvent( e );
}

}

public function connect(host:String, port:int):void
{
Security.loadPolicyFile("xmlsocket://"+host+":"+port.toString());
this.host = host;
this.port = port;
socket.connect(this.host, this.port);
}

public function disconnect():void
{
keepAlive.stop();
socket.close();
}

public function send( message:String ):void
{
trace('send', message);
socket.writeUTFBytes(message);
socket.flush();
}

public function sendKeepAlive():void
{
this.send("<ping/>");
}

private function socketEventFunction(event:Event):void
{
trace("socketEventFunction", event.type)
var e:SocketConnectionEvent;
switch (event.type)
{
case Event.CONNECT:
//this.send(Event.CONNECT);
e = new SocketConnectionEvent(Define.CONNECT);
keepAlive.start();
break;
case Event.CLOSE:
//this.send(Event.CONNECT);
e = new SocketConnectionEvent(Define.CLOSE);
keepAlive.stop();
break;
case Event.ACTIVATE:
e = new SocketConnectionEvent(Define.ACTIVATE);
break;
default:
e = new SocketConnectionEvent(Define.NODEFINE);
}

//dispatchEvent( new Event(Event.CONNECT) );
dispatchEvent( e );
}

private function socketIOErrorEventFunction(event:IOErrorEvent):void
{
var e:SocketConnectionEvent;
e = new SocketConnectionEvent(Define.CLOSE);
dispatchEvent( e );
}

private function (event:SecurityErrorEvent):void
{
var e:SocketConnectionEvent;
e = new SocketConnectionEvent(Define.CLOSE);
dispatchEvent( e );
}

private function socketDataFunction(e:ProgressEvent):void
{
var bytedata:ByteArray = new ByteArray();
socket.readBytes( bytedata );
parseDataReceived(bytedata);
}

private function parseDataReceived( bytedata:ByteArray ):void
{
bytedata.position = 0;

var data:String = bytedata.readUTFBytes( bytedata.length );
trace('parseData:', data);
var xmlData:XMLDocument = new XMLDocument();
xmlData.ignoreWhite = true;

var xml:XMLList;
try
{
//xml = new XML(rawXML);

var isComplete: Boolean = true;
xmlData.parseXML( data );
var len:uint = xmlData.childNodes.length;
for (var i:int = 0; i < len; ++i)
{
// Read the data and send it to the appropriate parser
var currentNode:XMLNode = xmlData.childNodes[i];
trace('currentNode', currentNode.toString());
handleNodeType(currentNode);
}

}
catch (err:Error)
{
trace(err.toString());
}
}

private function handleNodeType(node:XMLNode):void
{
var nodeName:String = node.nodeName.toLowerCase();

var e:SocketConnectionEvent;
trace('nodeName:', nodeName);
e = new SocketConnectionEvent(node.attributes.type);
e.body = node;
dispatchEvent( e );
}
}
}

7、c++ as3.0 socket 封包和拆包,用C++當做伺服器,向客戶端發了一串消息,客戶端怎麼拆包呢?

拆包就是封包的逆操作,怎麼封的就怎麼專拆,例如:屬
scanf(charbuffer,"%d%s%d%s%d%s%d%s%s",&head->iType,type,&head->iLen,type,&user->id,type,&user->age,type,user->name);

8、as3 socket怎麼連接843埠(就是解決socket連接埠失敗的問題)

不需要你手動連copy,直接連接任意埠的socket就可以了,as3會自動訪問843埠獲取安全配置文件。
socket工作原理如下,以socket到10000埠為例:
1、AS3會首先嘗試指定伺服器的843埠是否開啟,如果開啟會進行連接進入步驟2,如果不成功進入步驟4
2、連接成功後,服務端需要發送安全配置文件,配置文件內容如下
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>
使用utf-8編碼發送,接收成功進入步驟3,失敗進入步驟5
3、當as3接收到安全配置文件後,斷開當前埠,嘗試連接10000埠,連接啟動成功
4、當843埠未開啟,連接會直接10000埠。進入步驟2
5、安全配置文件接收失敗拋出SecurityError

9、As3 Socket是怎麼連接伺服器的?

sock.connect("127.0.0.1",9999);第一個參數IP 第二個埠
然後 有發送 接收函數 具體看幫助

10、as3.0 socket 用C++做伺服器,發送三條數據,as3.0 做客戶端,接收到的數據只有一條,這是怎麼回事?

應該是三條合在一起了.

與as3socket伺服器相關的知識