套件 | flash.net |
類別 | public class DatagramSocket |
繼承 | DatagramSocket EventDispatcher Object |
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
AIR 描述檔支援:所有桌上型電腦作業系統、iOS (從 AIR 3.8 開始) 和 Android (從 AIR 3.8 開始) 都支援此項功能。AIR for TV 裝置不支援此項功能。您可以使用 DatagramSocket.isSupported
屬性測試執行階段的支援狀況。如需有關跨多個描述檔之 API 支援的詳細資訊,請參閱 AIR 描述檔支援。
資料包在來源及目的地之間個別傳輸。封包到達的順序不需要與送出的順序相同。在傳輸中遺失的封包沒有重新傳輸,或甚至偵測。
使用資料包通訊端傳送的資料不會自動分成可傳輸大小的封包。如果您傳送的 UDP 封包超過最大傳輸單元 (MTU) 大小,則網路會捨棄該封包 (沒有警告)。限制的 MTU 是任何在傳輸路徑上之介面、交換器,或路由器的最小 MTU。您可以使用 NetworkInterface 類別決定本機介面的 MTU,但是在網路上的其它節點可能有不同的 MTU 值。
Socket 類別使用提供保證封包傳送,以及自動分割和重組大型封包的 TCP。TCP 也提供較好的頻寬管理。這些功能表示使用 TCP 通訊端傳送的資料會造成較高的延遲,但對於大多數使用狀況,TCP 的優點大大超越缺點。大部分的網路通訊應該使用 Socket 類別而不是 DatagramSocket 類別。
DatagramSocket 類別對於可容忍傳輸延遲以及封包遺失的應用程式而言非常實用。例如,在 Voice-over-IP (VoIP) 應用程式與即時的網路作業,多人遊戲通常可以透過使用 UDP 獲益。DatagramSocket 類別對於某些伺服器端應用程式也非常實用。既然 UDP 是無狀態的通訊協定,使用 UDP 的伺服器可比使用 TCP 通訊協定的伺服器,處理更多來自更多用戶端的要求。
DatagramSocket 類別只能用於 Adobe AIR 應用程式,以及應用程式安全執行程序。
如需安全性詳細資訊,請參閱「Flash Player 開發人員中心」主題:安全性。
詳細資訊
相關 API 元素
屬性 | 定義自 | ||
---|---|---|---|
bound : Boolean [唯讀]
指出這個通訊端物件目前是否繫結到本機位址及連接埠。 | DatagramSocket | ||
connected : Boolean [唯讀]
指出這個通訊端物件目前是否連線到遠端位址及連接埠。 | DatagramSocket | ||
constructor : Object
類別物件的參照或是特定物件實體的建構函數。 | Object | ||
isSupported : Boolean [靜態] [唯讀]
指出執行階段環境是否支援 DatagramSocket 功能。 | DatagramSocket | ||
localAddress : String [唯讀]
在本機電腦上,這個通訊端繫結的 IP 位址。 | DatagramSocket | ||
localPort : int [唯讀]
在本機電腦上,這個通訊端繫結的通訊埠。 | DatagramSocket | ||
remoteAddress : String [唯讀]
這個通訊端連線的遠端電腦 IP 位址。 | DatagramSocket | ||
remotePort : int [唯讀]
這個通訊端連線的遠端電腦連接埠。 | DatagramSocket |
方法 | 定義自 | ||
---|---|---|---|
建立 DatagramSocket 物件。 | DatagramSocket | ||
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
會在 EventDispatcher 物件註冊事件偵聽程式,以便讓偵聽程式收到事件的通知。 | EventDispatcher | ||
繫結此通訊端到指定的本機位址及連接埠。 | DatagramSocket | ||
會關閉通訊端。 | DatagramSocket | ||
連線通訊端到指定的遠端位址及連接埠。 | DatagramSocket | ||
會將事件傳送到事件流程。 | EventDispatcher | ||
會檢查 EventDispatcher 物件是否有對特定的事件類型註冊偵聽程式。 | EventDispatcher | ||
指出物件是否有已定義的指定屬性。 | Object | ||
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。 | Object | ||
指出指定的屬性是否存在,以及是否可列舉。 | Object | ||
在繫結的 IP 位址與連接埠上,啟用此 DatagramSocket 物件,以接收內送封包。 | DatagramSocket | ||
會從 EventDispatcher 物件移除偵聽程式。 | EventDispatcher | ||
使用 UDP 傳送在 ByteArray 中包含位元組的封包。 | DatagramSocket | ||
為迴圈作業設定動態屬性的可用性。 | Object | ||
傳回代表此物件的字串,根據地區特定慣例進行格式化。 | Object | ||
會傳回指定之物件的字串形式。 | Object | ||
會傳回指定之物件的基本值。 | Object | ||
檢查此 EventDispatcher 物件是否已註冊事件偵聽程式,或者此物件的任何祖系已為特定事件類型註冊事件偵聽程式。 | EventDispatcher |
事件 | 摘要 | 定義自 | ||
---|---|---|---|---|
[廣播事件] 當 Flash Player 或 AIR 應用程式取得作業系統焦點並成為作用中時傳送。 | EventDispatcher | |||
當作業系統關閉這個通訊端時傳送。 | DatagramSocket | |||
當這個通訊端接收資料封包時傳送。 | DatagramSocket | |||
[廣播事件] 當 Flash Player 或 AIR 應用程式失去作業系統焦點並成為非作用中時傳送。 | EventDispatcher | |||
當此通訊端收到 I/O 錯誤時傳送。 | DatagramSocket |
bound | 屬性 |
connected | 屬性 |
isSupported | 屬性 |
localAddress | 屬性 |
localPort | 屬性 |
remoteAddress | 屬性 |
remotePort | 屬性 |
DatagramSocket | () | 建構函式 |
public function DatagramSocket()
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
建立 DatagramSocket 物件。
擲回值
SecurityError — 如果 AIR 應用程式安全執行程序之外的內容企圖建立 DatagramSocket 物件。
|
bind | () | 方法 |
public function bind(localPort:int = 0, localAddress:String = "0.0.0.0"):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
繫結此通訊端到指定的本機位址及連接埠。
bind()
方法同步執行。在程式碼下一行執行之前,繫結的作業完成。
參數
localPort:int (default = 0 ) — 繫結到本機電腦的連接埠號碼。如果 localPort 設定為 0 (預設),繫結下一個可用的系統連接埠。連線到 1024 以下連接埠號碼的權限受限於系統安全性原則。例如,在 Mac 及 Linux 系統,應用程式必須以 root 權限執行才能連線到 1024 以下的連接埠。
| |
localAddress:String (default = "0.0.0.0 ") — 本機電腦上要繫結的 IP 位址。這個位址可以是 IPv4 或 IPv6 位址。如果 localAddress 設定為 0.0.0.0 (預設值) 時,通訊端會偵聽所有可以使用的 IPv4 位址。若要偵聽所有可以使用的 IPv6 位址,您必須指定 "::" 做為 localAddress 引數。若要使用 IPv6 位址,電腦及網路都必須設定支援 IPv6。此外,繫結到 IPv4 位址的通訊端無法連線到使用 IPv6 位址的通訊端。同樣地,繫結到 IPv6 位址的通訊端無法連線到具有 IPv4 位址的通訊端。位址的類型必須符合。
|
擲回值
RangeError — 當 localPort 小於 0 或大於 65535 時就會發生這種錯誤。
| |
ArgumentError — 當 localAddress 不是語法結構上有效的 IP 位址時,就會發生這種錯誤。
| |
IOError — 如果通訊端無法繫結時就會發生這種錯誤,例如以下情況:
| |
Error — 當 localAddress 不是有效的本機位址時,就會發生這種錯誤。
|
範例 ( 如何使用本範例 )
udpSocket.bind(); //bind to any available port, listen on all IPv4 addresses udpSocket.bind( 0, "0.0.0.0" ); //same as above udpSocket.bind( 0, "127.0.0.1" ); //any available port on the localhost address udpSocket.bind( 8989, "192.168.0.1" ); //port 8989 on a particular IPv4 address udpSocket.bind( 0, "::" ); //any available port on all IPv6 address udpSocket.bind( 8989, "::1" ); //port 8989 on the IPv6 localhost address udpSocket.bind( 8989, "2001:1890:110b:1e19:f06b:72db:7026:3d7a" ); //port 8989 on a particular IPv6 address
close | () | 方法 |
connect | () | 方法 |
public function connect(remoteAddress:String, remotePort:int):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
連線通訊端到指定的遠端位址及連接埠。
當資料包通訊端為「已連線」,資料包封包只可以對指定的目標傳送或接收。忽略從其他來源的封包。不需要連線到資料包通訊端。建立連線就不需要過濾來自其他來源的無關封包。然而,UDP 通訊端連線不是持續的網路連線 (當它跟 TCP 連線比較時)。有可能遠端的通訊端根本不存在。
如果沒有呼叫 bind()
方法,通訊端會自動地繫結到預設的本機位址及連接埠。
參數
remoteAddress:String — 要建立連線之遠端電腦的 IP 位址。這個位址可以是 IPv4 或 IPv6 位址。如果沒有呼叫 bind() ,當呼叫預設 bind() 時,會使用 remoteAddress 的位址家族 (IPv4 或 IPv6)。
| |
remotePort:int — 遠端電腦上用於建立連線的連接埠號碼。
|
擲回值
RangeError — 當 localPort 小於 1 或大於 65535 時就會發生這種錯誤。
| |
ArgumentError — 當 localAddress 不是句法結構上有效的位址時,就會發生這種錯誤。或者使用預設路由位址 ('0.0.0.0' 或 '::') 時。
| |
IOError — 如果無法連線通訊端時就會發生這種錯誤,例如呼叫 connect() 之前並未呼叫 bind() ,而且預設的遠端位址系列無法繫結的時候。
|
receive | () | 方法 |
public function receive():void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
在繫結的 IP 位址與連接埠上,啟用此 DatagramSocket 物件,以接收內送封包。
此函數會立即傳回。在收到資料封包時,DatagramSocket 物件會傳送 data
事件。
事件
data: — 當接收到 UDP 封包時。
|
send | () | 方法 |
public function send(bytes:ByteArray, offset:uint = 0, length:uint = 0, address:String = null, port:int = 0):void
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
使用 UDP 傳送在 ByteArray 中包含位元組的封包。
如果通訊端已連線,會傳送封包至遠端位址以及在 connect()
方法中指定的連接埠,而且不能指定目標 IP 位址與連接埠。如果通訊端未連線,會將封包傳送到指定的位址與連接埠,而且您必須為 address
與 port
提供有效的值。如果沒有呼叫 bind()
方法,通訊端會自動地繫結到預設的本機位址及連接埠。
注意:不支援將資料傳送到廣播位址。
參數
bytes:ByteArray — 包含封包資料的 ByteArray。
| |
offset:uint (default = 0 ) — bytes ByteArray 物件中封包開頭的偏移 (從零開始)。
| |
length:uint (default = 0 ) — 在封包中位元組的數量。預設值為 0 會傳送整個 ByteArray,從 offset 參數指定的值開始。
| |
address:String (default = null ) — 遠端電腦的 IPv4 或 IPv6 位址。如果尚未使用 connect() 方法指定位址,則需要指定位址。
| |
port:int (default = 0 ) — 在遠端電腦上的連接埠號碼。如果該連接埠尚未使用 connect() 方法來指定,則需要大於 0 和小於 65536 的值。
|
擲回值
RangeError — 當 port 小於 1 或大於 65535 時就會發生這種錯誤。
| |
ArgumentError — 如果通訊端沒有連線且 address 不是格式正確的 IP 位址。
| |
IOError — 這個錯誤發生於:
| |
Error — 當 bytes 參數為 null 時。
| |
RangeError — 如果 offset 大於在 bytes 中指定的 ByteArray 長度,或是如果指定由 offset 寫入的資料加上 length 的總數超過可用的資料。
| |
IllegalOperationError — 當通訊端已經連線時,會指定 address 或 port 參數。
|
close | 事件 |
flash.events.Event
屬性 Event.type =
flash.events.Event.CLOSE
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
當作業系統關閉這個通訊端時傳送。
當呼叫 DatagramSocket close()
方法時,不會傳送 close
事件。
Event.CLOSE
常數會定義 close
事件物件的 type
屬性值。
這個事件具有下列屬性:
屬性 | 值 |
---|---|
bubbles | false |
cancelable | false ;沒有要取消的預設行為指令。 |
currentTarget | 正主動使用事件偵聽程式處理 Event 物件的物件。 |
target | 其連線已關閉的物件。 |
data | 事件 |
flash.events.DatagramSocketDataEvent
屬性 DatagramSocketDataEvent.type =
flash.events.DatagramSocketDataEvent.DATA
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2 |
當這個通訊端接收資料封包時傳送。
定義type
屬性值 (data
事件物件)。
ioError | 事件 |
flash.events.IOErrorEvent
屬性 IOErrorEvent.type =
flash.events.IOErrorEvent.IOERROR
語言版本: | ActionScript 3.0 |
執行階段版本: | AIR 2.5 |
當此通訊端收到 I/O 錯誤時傳送。
package { import flash.display.Sprite; import flash.events.DatagramSocketDataEvent; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.net.DatagramSocket; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFieldType; import flash.utils.ByteArray; import flash.utils.Timer; public class DatagramSocketExample extends Sprite { private var datagramSocket:DatagramSocket = new DatagramSocket();; private var localIP:TextField; private var localPort:TextField; private var logField:TextField; private var targetIP:TextField; private var targetPort:TextField; private var message:TextField; public function DatagramSocketExample() { setupUI(); } private function bind( event:Event ):void { if( datagramSocket.bound ) { datagramSocket.close(); datagramSocket = new DatagramSocket(); } datagramSocket.bind( parseInt( localPort.text ), localIP.text ); datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived ); datagramSocket.receive(); log( "Bound to: " + datagramSocket.localAddress + ":" + datagramSocket.localPort ); } private function dataReceived( event:DatagramSocketDataEvent ):void { //Read the data from the datagram log("Received from " + event.srcAddress + ":" + event.srcPort + "> " + event.data.readUTFBytes( event.data.bytesAvailable ) ); } private function send( event:Event ):void { //Create a message in a ByteArray var data:ByteArray = new ByteArray(); data.writeUTFBytes( message.text ); //Send a datagram to the target try { datagramSocket.send( data, 0, 0, targetIP.text, parseInt( targetPort.text )); log( "Sent message to " + targetIP.text + ":" + targetPort.text ); } catch ( error:Error ) { log( error.message ); } } private function log( text:String ):void { logField.appendText( text + "\n" ); logField.scrollV = logField.maxScrollV; trace( text ); } private function setupUI():void { targetIP = createTextField( 10, 10, "Target IP:", "192.168.0.1" ); targetPort = createTextField( 10, 35, "Target port:", "8989" ); message = createTextField( 10, 60, "Message:", "Lucy can't drink milk." ); localIP = createTextField( 10, 85, "Local IP", "0.0.0.0"); localPort = createTextField( 10, 110, "Local port:", "0" ); createTextButton( 250, 135, "Bind", bind ); createTextButton( 300, 135, "Send", send ); logField = createTextField( 10, 160, "Log:", "", false, 200 ) this.stage.nativeWindow.activate(); } private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField { var labelField:TextField = new TextField(); labelField.text = label; labelField.type = TextFieldType.DYNAMIC; labelField.width = 180; labelField.x = x; labelField.y = y; var input:TextField = new TextField(); input.text = defaultValue; input.type = TextFieldType.INPUT; input.border = editable; input.selectable = editable; input.width = 280; input.height = height; input.x = x + labelField.width; input.y = y; this.addChild( labelField ); this.addChild( input ); return input; } private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField { var button:TextField = new TextField(); button.htmlText = "<u><b>" + label + "</b></u>"; button.type = TextFieldType.DYNAMIC; button.selectable = false; button.width = 180; button.x = x; button.y = y; button.addEventListener( MouseEvent.CLICK, clickHandler ); this.addChild( button ); return button; } } }
Tue Jun 12 2018, 03:47 PM Z