包 | 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 配置文件支持。
数据报数据包在源和目标之间个别传输。数据包可按与发送顺序不同的顺序到达。不会重新传输在传输中丢失的数据包,甚至不检测这种丢失。
使用数据报套接字发送的数据不会自动分解为具有可传输大小的数据包。如果发送超出最大传输单元 (MTU) 大小的 UDP 数据包,网络会丢弃该数据包(不发出警告)。限制 MTU 是传输路径中任何接口、开关或路由器的最小 MTU。可使用 NetworkInterface 类确定本地接口的 MTU,但是网络中的其他节点可以具有不同的 MTU 值。
Socket 类使用 TCP 保护数据包传输,并自动分解和重组大型数据包。TCP 还提供更好的网络带宽管理。这些功能意味着使用 TCP 套接字发送的数据会导致更高的延迟,但是在多数使用情况下,TCP 的好处远远超过延迟的代价。大多数网络通信应使用 Socket 类而不是 DatagramSocket 类。
此 DatagramSocket 类在与注重短传输延迟和容许包丢失的应用程序一起使用时很有用。例如,voice-over-IP (VoIP) 应用程序中的网络操作和实时、多玩家游戏通常可受益于 UDP。对于一些服务器端应用程序,DatagramSocket 类也很有用。由于 UDP 是无状态协议,与使用 TCP 相比,使用它服务器可处理来自更多客户端的更多请求。
DatagramSocket 类仅可在 Adobe AIR 应用程序的应用程序安全沙箱中使用。
有关安全性的详细信息,请参阅 Flash Player 开发人员中心主题:安全性。
了解详细信息
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
bound : Boolean [只读]
表示此 Socket 对象当前是否绑定到本地地址和端口。 | DatagramSocket | ||
connected : Boolean [只读]
表示此 Socket 对象当前是否连接到远程地址和端口。 | 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 | ||
启用此 DatagramSocket 对象可接收绑定 IP 地址和端口上的传入数据包。 | 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 系统中,应用程序必须拥有连接到 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 |
启用此 DatagramSocket 对象可接收绑定 IP 地址和端口上的传入数据包。
该函数立即返回。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 导致从由 offset 参数指定的值开始发送整个 ByteArray。
| |
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 |
在此套接字接收数据包时进行调度。
定义data
事件对象的 type
属性值。
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, 11:04 AM Z