Среда выполнения по умолчанию ищет файл политики сокетов из порта 843. Как и в случае файлов политики URL, этот файл называется
основным файлом политики
.
Когда файлы политики были впервые введены в версии Flash Player 6, файлы политики сокетов еще не поддерживались. Подключения к сокет-серверам разрешались файлом политики, который находился в местоположении по умолчанию на HTTP-сервере с портом 80 того же хоста, что и сокет-сервер. Проигрыватель Flash Player 9 еще поддерживает эту возможность, а Flash Player 10 уже нет. В проигрывателе Flash Player 10 подключения к сокетам разрешаются только с помощью файлов политики сокетов.
Как и файлы политики URL-адресов, файлы политики сокетов поддерживают использование метаполитики, определяющей порты, у которых могут быть файлы политик. Однако вместо метаполитики «master-only» (только основной) в файлах политики сокетов по умолчанию используется метаполитика «all» (все). Таким образом, если в основном файле политики не установлены более строгие ограничения, проигрыватель Flash Player предполагает, что файл политики сокетов может быть у любого порта узла.
Доступ к подключениям к сокетам и XML-сокетам отключен по умолчанию, даже если сокет находится в том же домене, что и подключающийся SWF-файл. Чтобы разрешить доступ на уровне сокетов, можно поместить файл политики сокетов в любом из следующих местоположений:
-
порт 843 (местоположение основного файла политики);
-
тот же порт, что и для основного подключения к сокету;
-
другой порт.
По умолчанию Flash Player ищет файл политики сокетов у порта 843 и у того же порта, который используется для основного подключения к сокету. Чтобы передавать файл политики сокетов через другой порт, SWF-файл должен вызвать метод
Security.loadPolicyFile()
.
Файл политики сокетов имеет тот же синтаксис, что и файл политики URL-адресов, только в нем также должны быть указаны порты, для которых предоставляется доступ. Если файл политик сокетов передается через порт с номером меньше 1024, он может выдавать разрешение на доступ к любому порту; если файл политик передается через порт с номером 1024 и выше, он может выдавать разрешение на доступ только к другим портам с номером 1024 или выше. Разрешенные порты указываются атрибутом
to-ports
для тега
<allow-access-from>
. Разрешено использование отдельных номеров портов, диапазонов портов и знаков подстановки.
Ниже приводится пример файла политики сокетов.
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.example.com" to-ports="507,516" />
<allow-access-from domain="*.example.org" to-ports="516-523" />
<allow-access-from domain="adobe.com" to-ports="507,516-523" />
<allow-access-from domain="192.0.34.166" to-ports="*" />
</cross-domain-policy>
Чтобы получить файл политики сокетов через порт 843 или через тот же порт, через который установлено основное подключение к сокету, нужно вызвать метод
Socket.connect()
или
XMLSocket.connect()
. Проигрыватель Flash Player сначала проверяет основной файл политики у порта 843. Если он его находит, то проверяет наличие метаполитики, запрещающей передачу файлов политики сокетов через целевой порт. Если доступ не запрещен, проигрыватель Flash Player сначала ищет соответствующий атрибут
allow-access-from
в основном файле политики. Если он его не находит, то пытается получить файл политики через порт основного подключения к сокету.
Чтобы получить файл политики сокетов в другом местоположении, сначала нужно вызвать метод
Security.loadPolicyFile()
со специальным синтаксисом
"xmlsocket"
, как показано ниже.
Security.loadPolicyFile("xmlsocket://server.com:2525");
Вызовите метод
Security.loadPolicyFile()
перед вызовом метода
Socket.connect()
или
XMLSocket.connect()
. После этого проигрыватель Flash Player ожидает выполнения запроса файла политики, прежде чем принять решение относительно основного подключения. Однако, если в основном файле политики указано, что в данном местоположении не может находиться файл политики, то вызов метода
loadPolicyFile()
не даст результатов, даже если там будет файл политики.
Если разворачивается сокет-сервер и требуется добавить файл политики сокетов, нужно определиться, через какой порт будет передаваться этот файл: через порт основных подключений или через другой. В любом случае сервер должен дождаться первой передачи данных от клиента, прежде чем отправить ответ.
Когда проигрыватель Flash Player запрашивает файл политики, он всегда передает следующую строку после установки подключения:
<policy-file-request/>
Получив эту строку, сервер может передать файл политики. Запрос проигрывателя Flash Player всегда заканчивается нулевым байтом, и ответ сервера также должен заканчиваться нулевым байтом.
Не пытайтесь использовать одно и то же подключение и для запроса файла политики, и для основного подключения. Разорвите подключение после передачи файла политики. Если этого не сделать, проигрыватель Flash Player разрывает подключение, установленное для проверки файла политики, и только после этого устанавливает основное подключение.