PDA

Просмотр полной версии : Полиси файл для сокетов


Vilya21
18.07.2014, 14:23
Из справки адоби видно что просто взять crossdomain.xml для сокетов не получится:

Подключения к сокет-серверам разрешались файлом политики, который находился в местоположении по умолчанию на HTTP-сервере с портом 80 того же хоста, что и сокет-сервер. Проигрыватель Flash Player 9 еще поддерживает эту возможность, а Flash Player 10 уже нет. В проигрывателе Flash Player 10 подключения к сокетам разрешаются только с помощью файлов политики сокетов.

Доступ к подключениям к сокетам и XML-сокетам отключен по умолчанию, даже если сокет находится в том же домене, что и подключающийся SWF-файл. Чтобы разрешить доступ на уровне сокетов, можно поместить файл политики сокетов в любом из следующих местоположений:

порт 843 (местоположение основного файла политики);
тот же порт, что и для основного подключения к сокету;
другой порт.

Как же тогда забирать файл политик, если порт 843 закрыт на сервере или на роутере клиента у провайдера клиента или у корпоративного файрволла? Это получается что я не могу сделать приложение на сокетах "для всех"?

caseyryan
18.07.2014, 15:05
843 это порт по умолчанию. Его можно принудительно запрашивать на другом порте, через xmlsocket, к примеру так: Security.loadPolicyFile("xmlsocket://example.com:62100");
Если же закрыто все, кроме 80, 443 и 8080, то, увы, на сокетах не получится

nuToH
18.07.2014, 15:24
Не понимаю сути проблемы. Клиент подключаясь к серверу отправляет запрос вида '<policy-file-request/>\x00'
на который сервер может ответить вот так:
var policy:String = '<cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>\x00';
socket.writeUTFBytes ( policy );
socket.flush ();
socket.close ();
после чего будет второе подключение без запроса policy file.

Vilya21
18.07.2014, 16:36
Суть в том что подключение не состоится и дело до отправки '<policy-file-request/>\x00' не дойдёт, потому что закрыты порты на какой-либо из сторон или по дороге.

caseyryan
18.07.2014, 18:42
Для этого файл и запрашивается принудительно с другого порта

Nooob
19.07.2014, 03:12
Как реализовать:
Слушать сокет соединение (не crossdomain.xml забросить на веб сервер, а именно сокетный коннект слушать) по нужному порту и ждать от клиентов сообщение "<policy-file-request/>" в ответ всегда отправлять "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>" (нулевой байт в конце не забываем так как это xmlsocket) и закрыть соединение.

Файл политики спрашивается при прямом сокет коннекте в трёх вариантах по очереди:
1. Сначала по 843 порту. Если рутовый доступ есть, то лучше его использовать, так как он первый спрашивается.
Если нет ответа то
2. По указанному порту в Security.loadPolicyFile. Следует использовать в случаях когда не хочется смешивать два протокола xml-строковый (по которому общается политика) и например игровой бинарный.
Если нет ответа то
3. По тому же порту которому устанавливается соединение. Самый простой, но минус в том что нельзя адекватно организовать очередь пакетов (по хорошему нужно делать, пакеты могут быть не полные) так как всегда будешь ожидать строку "<policy-file-request/>" для всех клиентов.

Пример простого сокет серверного коннекта на AIR с двумя клиентами в виде игры крестики-нолики по третьему варианту.
31032
по аналогии такой же сервер будет и на java, и на php, и на c# и на C++

Если всё правильно делать, то флеш плеер всегда спросит эти 3 варианта. если где то выдалось cross-domain-policy то законнектиться.
По опыту скажу, что если есть возможность разделить web сервер (nginx, apache) и игровой сервер то лучше вешать на 80 порт, так как 80 у всех пользователей открыт (кроме пользователей которые через прокси сидят, с only http, тут уже ничего не поделаешь)