Сокет — это тип сетевого подключения, устанавливаемого между двумя компьютерными процессами. Как правило, процессы выполняются на двух разных компьютерах, подключенных к IP-сети. Однако подключенные процессы могут выполняться на одном компьютере при использовании IP-адреса «локального хоста».
Adobe Flash Player поддерживает клиентские сокеты TCP (Transport Control Protocol, протокол управления транспортировкой). Приложение Flash Player может подключаться к другому процессу, выступающему в роли сокет-сервера, однако не может принимать запросы входящих подключений от других процессов. Другими словами, приложение Flash Player может подключаться к серверу TCP, но не может выступать в его роли.
API-интерфейс Flash Player также включает класс XMLSocket. Класс XMLSocket использует протокол Flash Player, который позволяет обмениваться сообщениями XML с сервером, поддерживающим работу по этому протоколу. Класс XMLSocket впервые появился в ActionScript 1 и существует до сих пор для обеспечения обратной совместимости. Для новых приложений следует использовать класс Socket, если необходимость подключиться к серверу, настроенному на работу с Flash XMLSocket, отсутствует.
В среду Adobe AIR добавлен ряд дополнительных классов для сетевого программирования на основе сокетов. Приложения AIR могут работать как сокет-серверы TCP при использовании класса ServerSocket и могут подключаться к серверам, для которых требуется защита SSL или TLS, при использовании класса SecureSocket. Приложения AIR могут также отправлять и получать сообщения по протоколу UDP (Universal Datagram Protocol, универсальный протокол передачи данных) при использовании класса DatagramSocket.
TCP-сокеты
Протокол Transmission Control Protocol (TCP) предоставляет возможность обмена сообщениями через постоянное сетевое подключение. При использовании протокола TCP гарантируется доставка сообщений в том порядке, в котором они были отправлены (за исключением случаев возникновения серьезных неполадок в сети). Для соединений TCP требуется «клиент» и «сервер». Проигрыватель Flash Player может создавать сокеты клиента. В дополнение к этому Adobe AIR может создавать сокеты сервера.
Подключения TCP обеспечивают следующие API-интерфейсы ActionScript.
-
Socket позволяет клиентскому приложению подключаться к серверу. Класс Socket не прослушивает входящие соединения.
-
SecureSocket (AIR) позволяет клиентскому приложению подключаться к доверенному серверу и обмениваться данными с использованием шифрования.
-
ServerSocket (AIR) позволяет приложению прослушивать входящие подключения и выступать в роли сервера.
-
XMLSocket позволяет клиентскому приложению подключаться к серверу XMLSocket.
Двоичные клиентские сокеты
Подключение к двоичному сокету похоже на подключение к XML-сокету, только клиенту и серверу можно обмениваться не только XML-пакетами. Вместо этого подключение может передавать данные в виде двоичной информации. Это позволяет подключаться к различным службам, в том числе к почтовым серверам (POP3, SMTP и IMAP) и серверам новостей (NNTP).
класс Socket
Класс Socket позволяет создавать подключения к сокету, а также считывать и записывать необработанные двоичные данные. Класс Socket используется для взаимодействия с серверами, использующими двоичные протоколы. Используя подключения через двоичный сокет, можно написать код, который взаимодействует с несколькими различными интернет-протоколами, например POP3, SMTP, IMAP и NNTP. Это взаимодействие, в свою очередь, позволяет приложениям подключаться к почтовым серверам и серверам новостей.
Проигрыватель Flash Player может взаимодействовать с сервером напрямую, с использованием двоичного протокола этого сервера. Одни серверы используют прямой порядок байтов, а другие — обратный порядок байтов. Большинство серверов в Интернете используют обратный порядок байтов, так как он является «сетевым порядком байтов». Порядок байтов от младшего к старшему популярен потому, что используется в архитектуре Intel® x86. Необходимо использовать тот порядок байтов, который соответствует порядку байтов сервера, отправляющего или получающего данные. Все операции, выполняемые интерфейсами IDataInput и IDataOutput, и классы, реализующие эти интерфейсы (ByteArray, Socket и URLStream), по умолчанию кодируются в формате от старшего к младшему, то есть начиная с самого значимого байта. Этот порядок байтов по умолчанию был выбран для обеспечения соответствия порядку байтов Java и официальному сетевому порядку байтов. Чтобы поменять используемый порядок байтов с одного на другой, можно задать свойству
endian
значение
Endian.BIG_ENDIAN
или
Endian.LITTLE_ENDIAN
.
Класс Socket наследует все методы, определенные в интерфейсах IDataInput и IDataOutput (которые находятся flash.utils). Эти методы необходимо использовать для записи и чтения данных объекта Socket.
Дополнительные сведения см. в разделе:
Безопасные сокеты клиента (AIR)
Класс SecureSocket можно использовать для подключения к серверам сокетов, которые используют SSL4 или TLS1. Использование защищенного сокета обеспечивает три преимущества: проверку подлинности сервера, целостность данных и конфиденциальность сообщений. Среда выполнения проверяет подлинность сервера с помощью сертификата сервера и его отношения корневому сертификату или сертификату промежуточного центра сертификации в хранилище сертификатов пользователя. Среда выполнения использует алгоритмы шифрования протоколов SSL и TLS, чтобы обеспечивать целостность данных и конфиденциальность сообщений.
При подключении к серверу с помощью объекта SecureSocket среда выполнения проверяет сертификат сервера с помощью хранилища доверенных сертификатов. На платформах Windows и Mac операционная система предоставляет хранилище доверия. В ОС Linux среда выполнения предоставляет собственное хранилище доверенных сертификатов.
Если сертификат сервера недействительный или недоверенный, среда выполнения отправляет событие
ioError
. Чтобы определить, почему не удалось пройти проверку, можно проверить свойство
serverCertificateStatus
объекта SecureSocket. Подключиться к серверу, у которого нет действующего и доверенного сертификата, невозможно.
Класс CertificateStatus определяет строковые константы, которые представляют возможные результаты проверки.
-
Expired (истек): прошла дата окончания срока действия сертификата.
-
Invalid (недействительный): существует несколько причин, по которым сертификат может быть недействительным. Например, сертификат мог быть изменен, поврежден или иметь неправильный тип.
-
Invalid chain (недействительная цепочка): недействителен один или несколько сертификатов в цепочке сертификатов сервера.
-
Principal mismatch (принципиальное несоответствие): имя хоста сервера и общее имя сертификата не соответствуют. Другими словами, сервер использует неправильный сертификат.
-
Revoked (отозванный): сертификат отозван выпустившим его центром сертификации.
-
Trusted (доверенный): сертификат является действительным и доверенным. Объект SecureSocket может подключаться только к серверу, который использует действующий и доверенный сертификат.
-
Unknown (неизвестный): объект SecureSocket еще не проверил сертификат. Свойство
serverCertificateStatus
имеет это значение состояние до вызова метода
connect()
и до отправки события
connect
или
ioError
.
-
Untrusted signers (недоверенные подписчики): сертификат не восходит по цепочке к доверенному корневому сертификату в хранилище сертификатов на клиентском компьютере.
Для связи посредством объекта SecureSocket требуется сервер, использующий защищенный протокол и имеющий действительный доверенный сертификат. В остальных отношениях объект SecureSocket используется так же, как объект Socket.
Объект SecureSocket поддерживается не всеми платформами. Используйте свойство
isSupported
класса SecureSocket, чтобы проверить, поддерживает ли среда выполнения использование объекта SecureSocket на текущем клиентском компьютере.
Дополнительные сведения см. в разделе:
Пример сокета TCP: создание клиента Telnet
На примере создания клиента Telnet демонстрируются приемы подключения к удаленному серверу и передачи данных с помощью класса Socket. В данном примере рассматриваются следующие приемы:
-
создание пользовательского клиента Telnet с помощью класса Socket;
-
отправка текста удаленному серверу с помощью объекта ByteArray;
-
обработка данных, полученных от удаленного сервера.
Получить файлы приложения для этого примера можно на странице
www.adobe.com/go/learn_programmingAS3samples_flash_ru
. Файлы приложения Telnet находятся в папке Samples/Telnet. Приложение состоит из следующих файлов.
File
|
Описание
|
TelnetSocket.fla
или
TelnetSocket.mxml
|
Основной файл приложения, состоящий из пользовательского интерфейса для Flex (MXML) или Flash (FLA).
|
TelnetSocket.as
|
Класс документа, отвечающий за поведение интерфейса (только Flash).
|
com/example/programmingas3/Telnet/Telnet.as
|
Обеспечивает функции клиента Telnet для приложения, включая подключение к удаленному серверу, отправку, получение и отображение данных.
|
Обзор приложения Telnet на базе сокетов
Основной файл TelnetSocket.mxml отвечает за создание пользовательского интерфейса для всего приложения.
Помимо пользовательского интерфейса, этот файл определяет два метода,
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 = "";
}
Первая строка кода импортирует класс Telnet из пользовательского пакета com.example.programmingas.socket. Вторая строка кода объявляет экземпляр класса Telnet,
telnetClient
, который инициализируется позже с помощью метода
connect()
. Затем объявляется метод
connect()
, который вводит переменную
telnetClient
, объявленную ранее. Этот метод передает указанные пользователем имя и порт сервера Telnet, а также ссылку на компонент TextArea в списке отображения, который используется для отображения текстовых ответов от сокет-сервера. Последние две строки метода
connect()
задают свойство
title
для компонента Panel и включают 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, который пытается подключиться к серверу, определенному переменными
serverURL
и
portNumber
.
Четвертая переменная,
ta
— это ссылка на экземпляр компонента TextArea, добавленный в рабочую область. Этот компонент служит для отображения ответов удаленного сервера Telnet или сообщений об ошибках.
Последняя переменная,
state
— это числовое значение, которое служит для определения параметров, поддерживаемых клиентом Telnet.
Как показано в примере, конструктор класса Telnet вызывается методом
connect()
в основном файле приложения.
Конструктор Telnet принимает три параметра:
server
,
port
и
output
. Параметры
server
и
port
указывают имя и номер порта сервера 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 не может туннелировать вход через брандмауэры автоматически, так как в отличие от протокола Real-Time Messaging Protocol (RTMP) XMLSocket не имеет функции HTTP-туннелирования. Если требуется использовать HTTP-туннелирование, попробуйте использовать ПО Flash Remoting или Flash Media Server (поддерживающие протокол RTMP).
На то, каким образом и где содержимое, не входящее в Flash Player или изолированную программную среду приложения AIR, может использовать объект XMLSocket для подключения к серверу, накладываются следующие ограничения.
-
В отношении содержимого вне изолированной программной среды приложения метод
XMLSocket.connect()
может устанавливать соединение только с TCP-портами, номера которых начинаются с 1024. Следствием такого ограничения является то, что для серверных управляющих программ, которые обмениваются данными с объектом
XMLSocket
, также должны быть назначены номера портов, начиная с 1024 и выше. Номера портов ниже 1024 часто используются системными службами, например FTP (21), Telnet (23), SMTP (25), HTTP (80) и POP3 (110), поэтому объекты XMLSocket не используют эти порты из соображений безопасности. Ограничение по номерам портов снижает риск несанкционированного доступа к ресурсам и их неправомочного использования.
-
В отношении содержимого вне изолированной программной среды приложения метод
XMLSocket.connect()
может устанавливать соединение только с компьютерами, входящими в тот же домен, что и содержимое. (Это ограничение аналогично правилам безопасности, применимым к методу
URLLoader.load()
.) Для подключения к серверной управляющей программе, выполняющейся не в том домене, в который входит содержимое, можно создать на сервере файл междоменной политики, в котором будет прописан доступ определенных доменов. Дополнительные сведения о файлах междоменной политики см. в разделе «
Безопасность AIR
».
Примечание.
Настройка сервера на обмен данными с объектом XMLSocket может представлять некоторую трудность. Если вашему приложению не требуется осуществлять взаимодействие в реальном времени, используйте класс URLLoader вместо класса XMLSocket.
При помощи методов
XMLSocket.connect()
и
XMLSocket.send()
класса XMLSocket можно передавать данные XML на сервер и получать данные с сервера, используя подключение через сокет. Метод
XMLSocket.connect()
устанавливает подключение к порту веб-сервера через сокет. Метод
XMLSocket.send()
передает объект XML на сервер, указанный в подключении через сокет.
При вызове метода
XMLSocket.connect()
приложение открывает подключение TCP/IP к серверу и не закрывает его до наступления одного из следующих событий.
-
Вызов метода
XMLSocket.close()
класса XMLSocket.
-
Больше не существует ссылок на объект XMLSocket.
-
Завершается работа проигрывателя Flash Player.
-
Соединение прервано (например, отключился модем).
Подключение к серверу при помощи класса XMLSocket
Для создания подключения через сокет необходимо создать серверное приложение, которое будет ожидать запрос на подключение через сокет и отправлять ответ проигрывателю Flash Player или приложению AIR. Такое серверное приложение может быть создано в среде AIR или написано на таком языке программирования, как Java, Python или Perl. Для работы с классом XMLSocket на серверном компьютере необходимо запустить скрытый процесс (daemon), который понимает простой протокол, используемый классом XMLSocket.
-
Сообщения XML отправляются с использованием подключения через потоковый сокет TCP/IP в полнодуплексном режиме.
-
Каждое сообщение XML представляет собой полноценный документ XML, заканчивающийся нулевым (0) байтом.
-
Через одно подключение XMLSocket можно отправить и получить неограниченное количество сообщений XML.
Создание сокет-сервера Java XML и подключение к нему
Следующий код иллюстрирует простой сервер XMLSocket, написанный на языке Java, который принимает входящие соединения и отображает полученные сообщения в окне запроса команд. По умолчанию новому серверу назначается порт 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. При этом создается файл класса Java с именем SimpleServer.class.
Запустить сервер XMLSocket можно, открыв окно запроса команд и введя
java SimpleServer
. Файл SimpleServer.class может размещаться в любом месте на локальном компьютере или в локальной сети; его не обязательно помещать в корневой каталог веб-сервера.
Если сервер запустить не удается из-за того, что файлы находятся не в пути к классам 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 можно использовать для последующей связи с другим процессом.
Чтобы прослушивать входящие подключения сокетов, выполните следующие действия.
-
Создайте объект ServerSocket и свяжите его с локальным портом.
-
Добавьте прослушиватели для события
connect
.
-
Вызовите метод
listen()
.
-
Отвечайте на событие
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)
Протокол Universal Datagram Protocol (UDP) предоставляет возможность обмена сообщениями через сетевое подключение, не использующее информацию о состоянии. UDP не гарантирует, что сообщения будут доставляться по порядку и что они будут вообще доставлены. При использовании UDP сетевой код операционной системы обычно затрачивает меньше времени на передачу, отслеживание и подтверждение сообщений. Поэтому сообщения UDP обычно доходят до целевого приложения раньше, чем сообщения TCP.
Связь через сокеты UDP применяется, когда необходимо отправлять информацию в реальном времени, например для обновления местоположения в игре или передачи звуковых пакетов в приложении аудиочата. В подобных приложениях допускается некоторый процент потери данных, и высокая скорость передачи важнее гарантированного получения. Однако почти для всех остальных применений лучше использовать сокеты TCP.
Приложение AIR может отправлять и получать сообщения UDP с помощью классов DatagramSocket и DatagramSocketDataEvent. Чтобы отправить или получить сообщение UDP, выполните следующие действия.
-
Создайте объект DatagramSocket.
-
Добавьте прослушиватель для события
data
.
-
Свяжите сокет с локальным IP-адресом и портом с помощью метода
bind()
.
-
Отправьте сообщения, вызвав метод
send()
и передав IP-адрес и порт целевого компьютера.
-
Получите сообщения, ответив на событие
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), установленного для сетевого интерфейса или любых промежуточных сетевых узлов между отправителем и получателем. Все данные в объекте ByteArray, передаваемом методу send(), отправляется как один пакет. (При использовании TCP большие сообщения разбиваются на отдельные пакеты.)
-
Между отправителем и получателем не выполняется квитирование установки связи. Сообщения отвергаются без вывода ошибки, если целевой узел не существует или для указанного порта нет активного прослушивателя.
-
Когда используется метод
connect()
, сообщения, отправляемые из других источников, игнорируются. Подключение UDP обеспечивает только удобную фильтрацию пакетов. Однако это не означает, что для целевого адреса и порта обязательно есть активный процесс прослушивания.
-
Трафик UDP может перегружать сеть. Сетевым администраторам может потребоваться внедрить элементы управления качеством обслуживания в случае такой перегрузки. (Протокол TCP имеет встроенное управление трафиком для предотвращения перегрузки каналов связи.)
Дополнительные сведения см. в разделе:
Адреса IPv6
Проигрыватель Flash Player 9.0.115.0 и более поздние версии поддерживают IPv6 (интернет-протокол версии 6). IPv6 — это версия Internet Protocol (интернет-протокола), поддерживающего 128-битные адреса (усовершенствование протокола IPv4, поддерживающего только 32-битные адреса). Вам может потребоваться активировать IPv6 на используемых интерфейсах сетевых соединений. Дополнительные сведения см. в справочных документах операционной системы, в которой размещены ваши данные.
Если система хостинга поддерживает IPv6, вы можете указывать цифровые адреса IPv6 в URL-адресах, заключенные в квадратные скобки ([]), как показано ниже:
[2001:db8:ccc3:ffff:0:444d:555e:666f]
Проигрыватель Flash Player возвращает буквенные значения IPv6 согласно следующим правилам.
-
Проигрыватель Flash Player возвращает длинную форму строки для адресов IPv6.
-
Значение IP-адреса не имеет сокращений с двойным двоеточием.
-
Шестнадцатеричные знаки могут быть только в нижнем регистре.
-
Адреса IPv6 заключаются в квадратные скобки ([]).
-
Каждый квартет адреса выводится как 0-4 шестнадцатеричных знаков, начальные нули опускаются.
-
Квартет адреса из четырех нулей выводится как один ноль (не как двойное двоеточие), за исключением случаев, перечисленных в следующем списке.
Значения IPv6, возвращаемые проигрывателем Flash Player, имеют следующие исключения.
-
Неопределенный адрес 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 (десятичного адреса с разделительными точками).
|
|
|