1. 程式人生 > 實用技巧 >[ActionScript 3.0] 套接字

[ActionScript 3.0] 套接字

AdobeFlashPlatform
檢視幫助 PDF ( 14MB)
主頁/ActionScript 3.0 開發人員指南/網路與通訊

套接字

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

套接字是在兩個計算機程序之間建立的一種網路連線型別。通常,這些程序在兩臺連線到相同 Internet 協議 (IP) 網路的不同計算機上執行。然而,連線的程序可以在使用特定“本地主機”IP 地址的同一臺計算機上執行。

Adobe Flash Player 支援客戶端傳輸控制協議 (TCP) 套接字。Flash Player 應用程式可以作為套接字伺服器連線到其他程序,但是不能接受來自其他程序的傳入連線請求。換句話說,Flash Player 應用程式可以連線到 TCP 伺服器,但不能用作 TCP 伺服器。

Flash Player API 也包含 XMLSocket 類。XMLSocket 類使用 Flash Player 特定的協議,通過該協議,您可以與識別該協議的伺服器交換 XML 訊息。ActionScript 1 中引入了 XMLSocket 類,該類現在仍然受支援以提供向後相容性。通常,除非連線到特別建立以與 Flash XMLSocket 進行通訊的伺服器,否則 Socket 類應該用於新應用程式。

Adobe AIR 添加了多個用於基於套接字的網路程式設計的附加類。藉助 ServerSocket 類,AIR 應用程式可以用作 TCP 套接字伺服器,並可以連線到要求 SSL 或 TLS 安全的套接字伺服器。AIR 應用程式還可以使用 DatagramSocket 類傳送和接收通用資料報協議 (UDP) 訊息。

TCP 套接字

通過傳輸控制協議 (TCP),可通過永久網路連線交換訊息。TCP 可確保傳送的任何訊息都以正確的順序到達,出現重大網路問題時除外。TCP 連線要求具有“客戶端”和“伺服器”。Flash Player 可以建立客戶端套接字。此外,Adobe AIR 可以建立伺服器套接字。

下列 ActionScript API 提供了 TCP 連線:

  • 套接字 — 允許客戶端應用程式連線到伺服器。Socket 類無法偵聽傳入連線。

  • SecureSocket (AIR) — 允許客戶端應用程式連線到受信任伺服器並進行加密通訊。

  • ServerSocket (AIR) — 允許應用程式偵聽傳入連線並用作伺服器。

  • XMLSocket — 允許客戶端應用程式連線到 XMLSocket 伺服器。

二進位制客戶端套接字

二進位制套接字連線與 XML 套接字類似,不同的是客戶端和伺服器不侷限於交換 XML 訊息。該連線可以將資料作為二進位制資訊傳輸。因此,您可以連線到更加豐富的服務,包括郵件伺服器(POP3、SMTP 和 IMAP)和新聞伺服器 (NNTP)。

Socket 類

使用 Socket 類,您可以建立套接字連線以及讀取和編寫原始二進位制資料。在與使用二進位制協議的伺服器進行互動操作時,Socket 類非常有用。使用二進位制套接字連線,您可以編寫與多個不同的 Internet 協議(例如 POP3、SMTP、IMAP 和 NNTP)進行互動的程式碼。這種互動進而又使您的應用程式可以連線到郵件伺服器和新聞伺服器。

Flash Player 可通過使用伺服器的二進位制協議直接與該伺服器連線。某些伺服器使用 big-endian 位元組順序,某些伺服器則使用 little-endian 位元組順序。Internet 上的大多數伺服器使用 big-endian 位元組順序,因為“網路位元組順序”為 big-endian。little-endian 位元組順序很常用,因為 Intel® x86 體系結構使用該位元組順序。您應使用與收發資料的伺服器的位元組順序相匹配的 endian 位元組順序。預設情況下,IDataInput 和 IDataOutput 介面執行的所有操作和實現這些介面的類(ByteArray、Socket 和 URLStream)都以 big-endian 格式編碼;即,最高有效位元組位於前面。選擇的這種預設位元組順序與 Java 和正式網路位元組順序匹配。要更改是使用 big-endian 還是使用 little-endian 位元組順序,可以將endian屬性設定為Endian.BIG_ENDIANEndian.LITTLE_ENDIAN

Socket 類繼承了由 IDataInput 和 IDataOutput 介面定義的所有方法(位於 flash.utils 包中)。必須使用這些方法寫入和讀取套接字。

有關詳細資訊,請參閱:

安全客戶端套接字 (AIR)

您可以使用 SecureSocket 類連線到使用第 4 版安全套接字層 (SSLv4) 或第 1 版傳輸層安全性 (TLSv1) 的套接字伺服器。安全套接字提供了三大優勢:伺服器身份驗證、資料完整性和訊息機密性。執行時使用伺服器證書及其在使用者信任儲存區中授權機構頒發的根證書或中級證書的相關性對伺服器進行身份驗證。執行時依靠 SSL 和 TLS 協議實現所使用的加密演算法提供資料完整性和訊息機密性。

當您使用 SecureSocket 物件連線到伺服器時,執行時將使用證書信任儲存區驗證伺服器證書。在 Windows 和 Mac 上,作業系統提供信任儲存區。在 Linux 中,執行時自行提供信任儲存區。

如果伺服器證書無效或不可信,執行時將排程ioError事件。您可以檢查 SecureSocket 物件的serverCertificateStatus屬性來確定驗證失敗的原因。沒有為與不具備有效和可信證書的伺服器進行通訊提供任何設定。

CertificateStatus 類用於定義表示可能的驗證結果的字串常量:

  • 過期 — 已超過證書過期日期。

  • 無效 — 多種原因可導致證書無效。例如,證書可能已更改、損壞,或者是錯誤型別的證書。

  • 無效鏈 — 證書的伺服器鏈中有一個或多個證書無效。

  • 主體不匹配 — 伺服器的主機名與證書公用名不匹配。換句話說,伺服器使用的是錯誤的證書。

  • 吊銷 — 證書頒發機構已吊銷該證書。

  • 受信任 — 證書有效且受信任。SecureSocket 物件僅可以連線到使用有效的受信任證書的伺服器。

  • 未知 — SecureSocket 物件尚未驗證證書。serverCertificateStatus屬性在您呼叫connect()和排程connectioError事件之前具有此狀態值。

  • 不受信任的簽名者 — 證書不能“連結”到客戶端計算機的信任儲存區中的受信任根證書。

與 SecureSocket 物件通訊要求伺服器使用安全協議,幷包含有效的受信任證書。在其他方面,使用 SecureSocket 物件與使用 Socket 物件是相同的。

並不是所有平臺都支援 SecureSocket 物件。使用 SecureSocket 類isSupported屬性測試執行時是否支援在當前客戶端計算機上使用 SecureSocket 物件。

有關詳細資訊,請參閱:

TCP 套接字示例:構建 Telnet 客戶端

Telnet 示例說明了使用 Socket 類連線遠端伺服器和傳輸資料的方法。該示例演示下列方法:

  • 使用 Socket 類建立自定義 telnet 客戶端

  • 使用 ByteArray 物件將文字傳送到遠端伺服器

  • 處理從遠端伺服器收到的資料

若要獲取此範例的應用程式檔案,請參閱www.adobe.com/go/learn_programmingAS3samples_flash_cn。可以在 Samples/Telnet 資料夾中找到 Telnet 應用程式檔案。該應用程式包含以下檔案:

檔案

說明

TelnetSocket.fla

TelnetSocket.mxml

由使用者介面組成的 Flex 或 Flash 的主應用程式檔案(分別為 MXML 和 FLA 格式)。

TelnetSocket.as

用於提供使用者介面邏輯的文件類(僅限 Flash)。

com/example/programmingas3/Telnet/Telnet.as

為應用程式提供 Telnet 客戶端功能,例如連線到遠端伺服器以及傳送、接收和顯示資料。

Telnet 套接字應用程式概述

主 TelnetSocket.mxml 檔案負責為整個應用程式建立使用者介面 (UI)。

除了 UI,此檔案還定義兩個方法login()sendCommand(),以便將使用者連線到指定的伺服器。

下面的程式碼列出了主應用程式檔案中的 ActionScript:

import com.example.programmingas3.socket.Telnet; 
 
private var telnetClient:Telnet; 
private function connect():void 
{ 
    telnetClient = new Telnet(serverName.text, int(portNumber.text), output); 
    console.title = "Connecting to " + serverName.text + ":" + portNumber.text; 
    console.enabled = true; 
} 
private function sendCommand():void 
{ 
    var ba:ByteArray = new ByteArray(); 
    ba.writeMultiByte(command.text + "\n", "UTF-8"); 
    telnetClient.writeBytesToSocket(ba); 
    command.text = ""; 
}

第一行程式碼從自定義 com.example.programmingas.socket 包中匯入 Telnet 類。第二行程式碼宣告 Telnet 類的例項telnetClient,稍後由connect()方法初始化該例項。接下來,宣告connect()方法,該方法初始化先前宣告的telnetClient變數。此方法傳遞使用者指定的 telnet 伺服器名稱、telnet 伺服器埠和對顯示列表中 TextArea 元件的引用,其中,顯示列表用於顯示來自套接字伺服器的文字響應。connect()方法的最後兩行設定 Panel 的title屬性並啟用 Panel 元件,該元件允許使用者將資料傳送到遠端伺服器。主應用程式檔案中的最後一個方法sendCommand()用於將使用者的命令作為 ByteArray 物件傳送到遠端伺服器。

Telnet 類概述

Telnet 類負責連線到遠端 Telnet 伺服器和傳送/接收資料。

Telnet 類宣告下列私有變數:

private var serverURL:String; 
private var portNumber:int; 
private var socket:Socket; 
private var ta:TextArea; 
private var state:int = 0;

第一個變數serverURL包含要連線到的使用者指定的伺服器地址。

第二個變數portNumber是 Telnet 伺服器當前在其上執行的埠號。預設情況下,Telnet 服務在埠 23 上執行。

第三個變數socket是一個 Socket 例項,該例項嘗試連線到serverURLportNumber變數定義的伺服器。

第四個變數ta是對舞臺上的 TextArea 元件例項的引用。此元件用於顯示來自遠端 Telnet 伺服器的響應或者任何可能的錯誤訊息。

最後一個變數state是數值,用於確定 Telnet 客戶端支援哪些選項。

正如您之前所見,Telnet 類的建構函式由主應用程式檔案中的connect()方法呼叫。

Telnet 建構函式採用三個引數:serverportoutputserverport引數指定 Telnet 伺服器在其上執行的伺服器名稱和埠號。最後一個引數output是對舞臺上的 TextArea 元件例項的引用,在該舞臺上將為使用者顯示伺服器輸出。

public function Telnet(server:String, port:int, output:TextArea) 
{ 
    serverURL = server; 
    portNumber = port; 
    ta = output; 
    socket = new Socket(); 
    socket.addEventListener(Event.CONNECT, connectHandler); 
    socket.addEventListener(Event.CLOSE, closeHandler); 
    socket.addEventListener(ErrorEvent.ERROR, errorHandler); 
    socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
    socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); 
    Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml"); 
    try 
    { 
        msg("Trying to connect to " + serverURL + ":" + portNumber + "\n"); 
        socket.connect(serverURL, portNumber); 
    } 
    catch (error:Error) 
    { 
        msg(error.message + "\n"); 
        socket.close(); 
    } 
}
向套接字寫入資料

要將資料寫入套接字連線,可以呼叫 Socket 類中的任何寫入方法。這些寫入方法包括writeBoolean()writeByte()writeBytes()writeDouble()及其他方法。然後,使用flush()方法重新整理輸出緩衝區中的資料。在 Telnet 伺服器中,使用writeBytes()方法向套接字連線中寫入資料,該方法將位元組陣列作為引數,並將其傳送到輸出緩衝區。writeBytesToSocket()方法如下:

public function writeBytesToSocket(ba:ByteArray):void 
{ 
    socket.writeBytes(ba); 
    socket.flush(); 
}

此方法是由主應用程式檔案中的sendCommand()方法呼叫的。

顯示來自套接字伺服器的訊息

當從套接字伺服器接收訊息,或者發生事件時,將呼叫自定義msg()方法。此方法將字串追加到舞臺上的 TextArea 並呼叫自定義setScroll()方法,該方法使 TextArea 元件滾動到底部。msg()方法如下:

private function msg(value:String):void 
{ 
    ta.text += value; 
    setScroll(); 
}

如果您未將 TextArea 元件的內容設定為自動滾動,則使用者需要手動拖動文字區域中的滾動條才能看到來自伺服器的最新響應。

滾動 TextArea 元件

setScroll()方法包含一行 ActionScript,用於垂直滾動 TextArea 元件內容,以便使用者可以檢視返回文字的最後一行。下面的片斷顯示了setScroll()方法:

public function setScroll():void 
{ 
    ta.verticalScrollPosition = ta.maxVerticalScrollPosition; 
}

此方法設定verticalScrollPosition屬性(該屬性是當前顯示的最上面一行字元的行號),並將其設定為maxVerticalScrollPosition屬性的值。

XML 套接字

通過 XML 套接字,可以建立與遠端伺服器的連線,且該伺服器在明確關閉之前始終保持開啟狀態。您可以在伺服器和客戶端之間交換字串資料,如 XML。使用 XML 套接字伺服器的優點之一是客戶端不需要明確請求資料。伺服器無需等待請求即可傳送資料,並且可以將資料傳送到每個已連線的客戶端。

在應用程式沙箱外的 Flash Player 和 Adobe AIR 內容中,XML 套接字連線要求在目標伺服器上提供套接字策略檔案。有關詳細資訊,請參閱網站控制(策略檔案)連線到套接字

XMLSocket 類不能自動穿過防火牆,因為 XMLSocket 沒有 HTTP 隧道功能(這與實時訊息傳遞協議 (RTMP) 不同)。如果您需要使用 HTTP 隧道,應考慮改用 Flash Remoting 或 Flash Media Server(支援 RTMP)。

對於應用程式安全沙箱外的 Flash Player 或 AIR 應用程式中的內容使用 XMLSocket 物件連線到伺服器的方式及位置,規定了下列限制:

  • 對於應用程式安全沙箱外部的內容,XMLSocket.connect()方法只能連線到埠號大於或等於 1024 的 TCP 埠。這種限制所帶來的後果之一是,向與XMLSocket物件通訊的伺服器守護程式分配的埠號也必須大於等於 1024。埠號小於 1024 的埠通常用於系統服務,例如 FTP (21)、Telnet (23)、SMTP (25)、HTTP (80) 和 POP3 (110),因此,出於安全方面的考慮,禁止 XMLSocket 物件使用這些埠。這種埠號方面的限制可以減少不恰當地訪問和濫用這些資源的可能性。

  • 對於應用程式安全沙箱外部的內容,XMLSocket.connect()方法只能連線到該內容所在的同一域中的計算機。(此限制與URLLoader.load()的安全規則相同。)若要連線到在內容所在域之外的其他域中執行的伺服器守護程式,可以在該伺服器上建立一個允許從特定域進行訪問的跨域策略檔案。有關跨域策略檔案的詳細資訊,請參閱AIR 安全性

注:將伺服器設定為與 XMLSocket 物件進行通訊可能會遇到一些困難。如果您的應用程式不需要進行實時互動,請使用 URLLoader 類,而不要使用 XMLSocket 類。

可以使用 XMLSocket 類的XMLSocket.connect()XMLSocket.send()方法,通過套接字連線與伺服器之間傳輸 XML。XMLSocket.connect()方法與 Web 伺服器埠建立套接字連線。XMLSocket.send()方法將 XML 物件傳遞給套接字連線中指定的伺服器。

當呼叫XMLSocket.connect()方法時,應用程式會開啟到伺服器的 TCP/IP 連線並使該連線保持開啟狀態,直到出現下列情況之一:

  • XMLSocket 類的XMLSocket.close()方法被呼叫。

  • 對 XMLSocket 物件的引用不再存在。

  • Flash Player 退出。

  • 連線中斷(例如,調變解調器斷開連線)。

使用 XMLSocket 類連線到伺服器

要建立套接字連線,必須建立伺服器端應用程式以等待套接字連線請求,並將響應傳送到 Flash Player 或 AIR 應用程式。此類伺服器端應用程式可使用 AIR 或其他程式語言(如 Java、Python 或 Perl)編寫。要使用 XMLSocket 類,伺服器計算機必須執行可識別 XMLSocket 類使用的簡單協議的守護程式:

  • XML 訊息通過全雙工 TCP/IP 流套接字連線傳送。

  • 每個 XML 訊息都是一個完整的 XML 文件,以一個零 (0) 位元組結束。

  • 通過 XMLSocket 連線傳送和接收的 XML 訊息的數量沒有限制。

建立並連線到 Java XML 套接字伺服器

下面的程式碼演示了一個用 Java 編寫的簡單 XMLSocket 伺服器,該伺服器接受傳入連線並在命令提示視窗中顯示接收到的訊息。雖然從命令列啟動伺服器時可以指定其他埠號,但預設情況下,在本地計算機上的 8080 埠建立新伺服器。

新建一個文字文件並新增下面的程式碼:

import java.io.*; 
import java.net.*; 
 
class SimpleServer 
{ 
    private static SimpleServer server; 
    ServerSocket socket; 
    Socket incoming; 
    BufferedReader readerIn; 
    PrintStream printOut; 
 
    public static void main(String[] args) 
    { 
        int port = 8080; 
 
        try 
        { 
            port = Integer.parseInt(args[0]); 
        } 
        catch (ArrayIndexOutOfBoundsException e) 
        { 
            // Catch exception and keep going. 
        } 
 
        server = new SimpleServer(port); 
    } 
 
    private SimpleServer(int port) 
    { 
        System.out.println(">> Starting SimpleServer"); 
        try 
        { 
            socket = new ServerSocket(port); 
            incoming = socket.accept(); 
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream())); 
            printOut = new PrintStream(incoming.getOutputStream()); 
            printOut.println("Enter EXIT to exit.\r"); 
            out("Enter EXIT to exit.\r"); 
            boolean done = false; 
            while (!done) 
            { 
                String str = readerIn.readLine(); 
                if (str == null) 
                { 
                    done = true; 
                } 
                else 
                { 
                    out("Echo: " + str + "\r"); 
                    if(str.trim().equals("EXIT")) 
                    { 
                        done = true; 
                    } 
                } 
                incoming.close(); 
            } 
        } 
        catch (Exception e) 
        { 
            System.out.println(e); 
        } 
    } 
 
    private void out(String str) 
    { 
        printOut.println(str); 
        System.out.println(str); 
    } 
}

將文件儲存到硬碟,命名為 SimpleServer.java 並使用 Java 編譯器對其進行編譯,這會建立一個名為 SimpleServer.class 的 Java 類檔案。

您可以通過開啟命令提示並鍵入java SimpleServer來啟動 XMLSocket 伺服器。SimpleServer.class 檔案可以位於本地計算機或網路上的任何位置,不需要放置在 Web 伺服器的根目錄中。

如果由於檔案沒有位於 Java 類路徑中而無法啟動伺服器,請嘗試使用java -classpath .SimpleServer啟動伺服器。

要從應用程式連線到 XMLSocket,需要新建一個 XMLSocket 類例項,並在傳遞主機名和埠號時呼叫XMLSocket.connect()方法,如下所示:

var xmlsock:XMLSocket = new XMLSocket(); 
xmlsock.connect("127.0.0.1", 8080);

只要從伺服器接收資料,就會排程data事件 (flash.events.DataEvent.DATA):

xmlsock.addEventListener(DataEvent.DATA, onData); 
private function onData(event:DataEvent):void 
{ 
    trace("[" + event.type + "] " + event.data); 
}

若要將資料傳送到 XMLSocket 伺服器,可以使用XMLSocket.send()方法並傳遞 XML 物件或字串。Flash Player 將提供的引數轉換為 String 物件,並將內容傳送到 XMLSocket 伺服器(後跟零 (0) 位元組):

xmlsock.send(xmlFormattedData);

XMLSocket.send()方法不返回指示資料是否成功傳輸的值。如果嘗試傳送資料時發生錯誤,將引發 IOError 錯誤。

傳送到 XML 套接字伺服器的每條訊息必須以換行符 (\n) 結束。

有關詳細資訊,請參閱XMLSocket

伺服器套接字

使用 ServerSocket 類可以允許其他程序使用傳輸控制協議 (TCP) 套接字連線到您的應用程式。可以在本地計算機或另一臺網路連線的計算機上執行連線程序。當 ServerSocket 物件收到連線請求時,會排程connect事件。該事件排程的 ServerSocketConnectEvent 物件包含 Socket 物件。您可以使用此 Socket 物件與其他程序進行後續通訊。

要偵聽傳入的套接字連線,請執行以下操作:

  1. 建立一個 ServerSocket 物件並將其繫結到本地埠

  2. connect事件新增事件偵聽器

  3. 呼叫listen()方法

  4. 響應connect事件,它為每個傳入連線提供 Socket 物件

ServerSocket 物件在您呼叫close()方法之前會繼續偵聽新連線。

以下程式碼示例說明了如何建立套接字伺服器應用程式。該示例偵聽埠 8087 上的傳入連線。收到連線時,此示例會將訊息(字串“Connected”)傳送給客戶端套接字。此後,伺服器會將任何收到的訊息回顯給客戶端。

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.events.ProgressEvent; 
    import flash.events.ServerSocketConnectEvent; 
    import flash.net.ServerSocket; 
    import flash.net.Socket; 
     
    public class ServerSocketExample extends Sprite 
    { 
        private var serverSocket:ServerSocket; 
        private var clientSockets:Array = new Array(); 
 
        public function ServerSocketExample() 
        { 
            try 
            { 
                // Create the server socket 
                serverSocket = new ServerSocket(); 
                 
                // Add the event listener 
                serverSocket.addEventListener( Event.CONNECT, connectHandler ); 
                serverSocket.addEventListener( Event.CLOSE, onClose ); 
                 
                // Bind to local port 8087 
                serverSocket.bind( 8087, "127.0.0.1" ); 
                 
                // Listen for connections 
                serverSocket.listen(); 
                trace( "Listening on " + serverSocket.localPort ); 
 
            } 
            catch(e:SecurityError) 
            { 
                trace(e); 
            } 
        } 
 
        public function connectHandler(event:ServerSocketConnectEvent):void 
        { 
            //The socket is provided by the event object 
            var socket:Socket = event.socket as Socket; 
            clientSockets.push( socket ); 
             
            socket.addEventListener( ProgressEvent.SOCKET_DATA, socketDataHandler); 
            socket.addEventListener( Event.CLOSE, onClientClose ); 
            socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError ); 
             
            //Send a connect message 
            socket.writeUTFBytes("Connected."); 
            socket.flush(); 
             
            trace( "Sending connect message" ); 
        } 
         
        public function socketDataHandler(event:ProgressEvent):void 
        { 
            var socket:Socket = event.target as Socket 
                 
            //Read the message from the socket 
            var message:String = socket.readUTFBytes( socket.bytesAvailable ); 
            trace( "Received: " + message); 
 
            // Echo the received message back to the sender 
            message = "Echo -- " + message; 
            socket.writeUTFBytes( message ); 
            socket.flush(); 
            trace( "Sending: " + message ); 
        } 
         
        private function onClientClose( event:Event ):void 
        { 
            trace( "Connection to client closed." ); 
            //Should also remove from clientSockets array... 
        } 
 
        private function onIOError( errorEvent:IOErrorEvent ):void 
        { 
            trace( "IOError: " + errorEvent.text ); 
        } 
 
        private function onClose( event:Event ):void 
        { 
            trace( "Server socket closed by OS." ); 
        } 
}}

有關詳細資訊,請參閱:

UDP 套接字 (AIR)

通用資料報協議 (UDP) 提供了一種通過無狀態網路連線交換訊息的方法。UDP 無法確保訊息按順序傳送,甚至無法確保訊息的傳送。使用 UDP,作業系統的網路程式碼通常在封送、跟蹤和確認訊息上將花費更少的時間。因此,通常 UDP 訊息到達目標應用程式的延遲比 TCP 訊息到達目標應用程式的延遲要短。

在必須傳送實時資訊(例如遊戲中的位置更新或音訊聊天應用程式中的聲音資料包)時,UDP 套接字通訊很有用。在此類應用程式中,丟失一些資料是可以接受的,並且低傳輸延遲比保證及時到達更重要。對於幾乎所有其他目的,TCP 套接字是更好的選擇。

AIR 應用程式可以使用 DatagramSocket 和 DatagramSocketDataEvent 類傳送和接收 UDP 訊息。要傳送或接收 UDP 訊息,請執行以下操作:

  1. 建立一個 DatagramSocket 物件

  2. data事件新增事件偵聽器

  3. 使用bind()方法將套接字繫結到本地 IP 地址和埠

  4. 通過呼叫send()方法傳送訊息,傳遞目標計算機的 IP 地址和埠

  5. 通過響應data事件接收訊息。為此事件排程的 DatagramSocketDataEvent 物件包含一個 ByteArray 物件,該物件中包含訊息資料。

以下程式碼示例說明應用程式如何傳送和接收 UDP 訊息。此示例將包含字串“Hello”的單一訊息傳送到目標計算機。它還跟蹤接收的任何訊息內容。

package 
{ 
import flash.display.Sprite; 
import flash.events.DatagramSocketDataEvent; 
import flash.events.Event; 
import flash.net.DatagramSocket; 
import flash.utils.ByteArray; 
 
public class DatagramSocketExample extends Sprite 
{ 
    private var datagramSocket:DatagramSocket; 
     
    //The IP and port for this computer 
    private var localIP:String = "192.168.0.1"; 
    private var localPort:int = 55555; 
     
    //The IP and port for the target computer 
    private var targetIP:String = "192.168.0.2"; 
    private var targetPort:int = 55555; 
     
    public function DatagramSocketExample() 
    { 
        //Create the socket 
        datagramSocket = new DatagramSocket(); 
        datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived ); 
         
        //Bind the socket to the local network interface and port 
        datagramSocket.bind( localPort, localIP ); 
         
        //Listen for incoming datagrams 
        datagramSocket.receive(); 
         
        //Create a message in a ByteArray 
        var data:ByteArray = new ByteArray(); 
        data.writeUTFBytes("Hello."); 
         
        //Send the datagram message 
        datagramSocket.send( data, 0, 0, targetIP, targetPort); 
    } 
     
    private function dataReceived( event:DatagramSocketDataEvent ):void 
    { 
        //Read the data from the datagram 
        trace("Received from " + event.srcAddress + ":" + event.srcPort + "> " + 
            event.data.readUTFBytes( event.data.bytesAvailable ) ); 
    } 
}}

使用 UDP 套接字時,請記住下列注意事項:

  • 單一資料包不能大於網路介面或傳送方和接收方之間任何網路節點的最大傳輸單位 (MTU) 中最小的那一個。傳遞到 send() 方法的 ByteArray 物件中的所有資料都將作為單一資料包傳送。(在 TCP 中,較大的訊息被分為幾個單獨的包。)

  • 傳送方和目標之間不存在訊號交換。如果目標不存在或指定埠上沒有活動偵聽器,則會丟棄訊息且不會報錯。

  • 使用connect()方法時,將忽略從其他源傳送的訊息。UDP 連線僅提供方便的資料包過濾。這並不意味著目標地址和埠上必須存在有效的偵聽程序。

  • UDP 流量可以造成網路擁塞。如果發生網路擁塞,網路管理員可能需要實現服務質量控制。(TCP 有內建的流量控制來減少網路擁塞的影響。)

有關詳細資訊,請參閱:

IPv6 地址

Flash Player 9.0.115.0 及更高版本支援 IPv6(Internet 協議版本 6)。IPv6 是支援 128 位地址的 Internet 協議版本(它是支援 32 位地址的早期 IPv4 協議的改進版本)。 您可能需要在網路介面中啟用 IPv6。 有關詳細資訊,請參閱承載資料的作業系統的幫助。

如果承載系統中支援 IPv6,您可以在用中括號 ([]) 括起的 URL 中指定數字 IPv6 文字地址,如下所示:

[2001:db8:ccc3:ffff:0:444d:555e:666f]

Flash Player 根據以下規則返回 IPv6 字面值:

  • Flash Player 返回長形式的 IPv6 地址字串。

  • IP 值沒有雙冒號縮寫詞。

  • 十六進位制數字全小寫。

  • IPv6 地址包含在中括號 ([]) 中。

  • 每個四重地址都輸出為 0 到 4 個十六進位制數字(省略前導零)。

  • 內容全為零的四重地址輸出為單個零(而不是雙冒號),下表所列例外情況除外。

Flash Player 返回的 IPv6 值具有以下例外:

  • 未指定的 IPv6 地址(內容全為零)輸出為 [::]。

  • 環回或本地主機 IPv6 地址輸出為 [::1]。

  • IPv4 對映(轉換為 IPv6)地址輸出為 [::ffff:a.b.c.d],其中 a.b.c.d 為典型的 IPv4 點分十進位制值。

  • IPv4 相容地址輸出為 [::a.b.c.d],其中 a.b.c.d 為典型的 IPv4 點分十進位制值。

更多幫助主題

連線到套接字

flash.net 包

Twitter™ 與 Facebook 中的內容不在 Creative Commons 的條款約束之下。