Пакет | 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 является наименьшее значение любого интерфейса, переключателя или маршрутизатора, задействованного в цепочке передачи. Класс NetworkInterface можно использовать для определения максимального размера пакета в локальном интерфейсе, но для остальных узлов сети могут быть установлены другие значения.
Класс Socket использует протокол TCP, который гарантирует доставку пакетов и автоматически выполняет разбивку и повторную сборку больших пакетов. TCP также позволяет лучше управлять пропускной способностью сети. Эти возможности означают, что на передачу данных через сокет TCP требуется больше времени, но для большинства пользователей преимущества протокола TCP существенно перевешивают его недостатки. В большинстве случаев для сетевого взаимодействия следует использовать класс Socket, а не DatagramSocket.
Класс DatagramSocket полезен для работы с приложениями, где большую роль играет маленькое время ожидания, и допускается потеря пакетов. Например, протокол UDP подходит для обеспечения сетевых операций в приложениях VoIP, а также в играх для нескольких игроков в реальном времени. Класс 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 | ||
Отправляет пакет, содержащий байты в массиве ByteArray, с помощью UDP. | DatagramSocket | ||
Задает доступность динамического свойства для операций цикла. | Object | ||
Возвращает строковое представление этого объекта, отформатированного в соответствии со стандартами, принятыми для данной локали. | Object | ||
Возвращает строковое представление заданного объекта. | Object | ||
Возвращает элементарное значение заданного объекта. | Object | ||
Проверяет, зарегистрирован ли прослушиватель события для указанного типа события с данным объектом EventDispatcher или любым его предшественником. | EventDispatcher |
Событие | Сводка | Определено | ||
---|---|---|---|---|
[многоадресное событие] Отправляется, когда проигрыватель Flash Player или приложение AIR перемещается в фокус операционной системы и становится активным. | EventDispatcher | |||
Отправляется, когда операционная система закрывает данный сокет. | DatagramSocket | |||
Отправляется, когда этот сокет получает пакет данных. | DatagramSocket | |||
[многоадресное событие] Отправляется, когда проигрыватель Flash Player или приложение AIR теряет фокус системы и становится неактивным. | EventDispatcher | |||
Передается, когда этот сокет получает ошибку ввода-вывода. | DatagramSocket |
bound | свойство |
connected | свойство |
connected:Boolean
[только для чтения] Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 2 |
Указывает, подключен ли сейчас данный объект Socket к удаленному адресу и порту.
Примечание. Значение true
не говорит о том, что удаленный компьютер прослушивает подключенный адрес и порт. Это лишь означает, что данный объект DataGramSocket будет обмениваться данными только с этим адресом и портом.
Реализация
public function get connected():Boolean
Связанные элементы API
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-адрес на связываемом локальном компьютере. Может использоваться адрес версии IPv6 или IPv4. Если свойство 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 | () | метод |
public function close():void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 2 |
Закрывает сокет.
Сокет отключается от удаленного компьютера, его связь с локальным компьютером отменяется. Закрытый сокет не может быть использован повторно.
Выдает
IOError — если сокет не может быть закрыт (из-за внутренней, сетевой или системной ошибки) или если сокет не открыт.
|
connect | () | метод |
public function connect(remoteAddress:String, remotePort:int):void
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 2 |
Подключает сокет к указанному удаленному адресу и порту.
Когда подключен сокет датаграмм, обмен пакетами датаграмм может осуществляться только с указанным целевым узлом. Пакеты из других источников игнорируются. Подключение сокета датаграмм не является обязательным. Установка подключения позволяет обойтись без фильтрации сторонних пакетов из других источников. Однако подключение сокета UDP не является постоянным сетевым соединением (в отличие от подключения TCP). Удаленного конца сокета может совсем не быть.
Если метод bind()
не вызывался, сокет автоматически связывается с локальным адресом и портом по умолчанию.
Параметры
remoteAddress:String — IP-адрес удаленного компьютера, с которым требуется установить соединение. Может использоваться адрес версии IPv6 или IPv4. Если метод bind() не вызывался, семейство адресов remoteAddress , IPv4 или IPv6, используется при вызове метода bind() по умолчанию.
| |
remotePort:int — Номер порта на удаленном узле, используемый для установки подключения.
|
Выдает
RangeError — Эта ошибка происходит, когда значение свойства localPort меньше чем 1 или больше чем 65535.
| |
ArgumentError — Эта ошибка происходит, когда свойство localAddress содержит синтаксически неправильный адрес. Или когда используется стандартный адрес маршрута («0.0.0.0» или «::»).
| |
IOError — Эта ошибка происходит, если сокет нельзя подключить, например когда метод bind() не вызывался перед методом connect() и невозможно установить связь по умолчанию с семьей удаленных адресов.
|
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 |
Отправляет пакет, содержащий байты в массиве ByteArray, с помощью UDP.
Если сокет подключен, пакет отправляется на удаленный адрес и порт, указанные в методе 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 ) — Номер порта на удаленном компьютере. Требуется значение больше 0 и меньше 65536, если порт еще не задан с помощью метода connect() .
|
Выдает
RangeError — Эта ошибка происходит, когда значение свойства port меньше чем 1 или больше чем 65535.
| |
ArgumentError — Если сокет не подключен и свойство address содержит синтаксически неправильный IP-адрес.
| |
IOError — Эта ошибка происходит:
| |
Error — когда параметр bytes имеет значение null .
| |
RangeError — Если значение offset превышает длину массива ByteArray, указанную в свойстве bytes или если сумма данных, указанная для записи в свойстве offset вместе со значением length превышает доступные данные.
| |
IllegalOperationError — если параметры address или port определяются после подключения к сокету.
|
close | Событие |
flash.events.Event
свойство Event.type =
flash.events.Event.CLOSE
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 2 |
Отправляется, когда операционная система закрывает данный сокет.
Событие close
не отправляется при вызове метода close()
класса DatagramSocket.
Event.CLOSE
определяет значение свойства type
объекта события close
.
Это событие имеет следующие свойства:
Свойство | Значение |
---|---|
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 |
Передается, когда этот сокет получает ошибку ввода-вывода.
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:34 AM Z