Двоичный сокет и файл политики в Flex - PullRequest
0 голосов
/ 17 мая 2010

Я пытаюсь оценить, может ли Flex получить доступ к двоичным сокетам. Похоже, есть класс звонков Socket (пакет flex.net). Требование заключается в том, что Flex будет подключаться к серверу, обслуживающему двоичные данные. Затем он подпишется на данные и получит канал, который он будет интерпретировать и отображать в виде графика. Я никогда не работал с Flex, мой опыт работы с Java, поэтому все для меня ново. Поэтому я пытаюсь быстро настроить что-то простое. Сервер Java ожидает следующее:

DataInputStream in = .....
byte cmd = in.readByte();
int size = in.readByte();
byte[] buf = new byte[size];
in.readFully(buf);
... do some stuff and send binary data in something like
out.writeByte(1);
out.writeInt(10000);
... etc...

Flex, необходимо подключиться к локальному хосту: 6666 выполняет рукопожатие и читает данные. Я получил что-то вроде этого:

        try {
            var socket:Socket = new Socket();

            socket.connect('192.168.110.1', 9999);
            Alert.show('Connected.');
            socket.writeByte(108); // 'l'
            socket.writeByte(115); // 's'
            socket.writeByte(4);
            socket.writeMultiByte('HHHH', 'ISO-8859-1');
            socket.flush();
        } catch (err:Error) {
            Alert.show(err.message + ": " + err.toString());
        }

Первое, что Flex делает <policy-file-request/>. Я изменил сервер, чтобы ответить:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>
   <site-control permitted-cross-domain-policies="master-only"/>
   <allow-access-from domain="192.168.110.1" to-ports="*" />
</cross-domain-policy>    

После этого - EOFException происходит на сервере и все.

Итак, вопрос в том, правильно ли я отношусь к проблеме потоковых данных, когда речь идет о Flex? Я неправильно отправляю файл политики? К сожалению, я не могу найти хороший пример того, как это сделать. Мне кажется, что Flex может создавать двоичные приложения клиент-сервер, но мне лично не хватает некоторых базовых знаний при этом.

Я использую Flex 3.5 в IntelliJ IDEA IDE.

Любая помощь приветствуется.

Спасибо!

1 Ответ

1 голос
/ 17 мая 2010

Я могу подтвердить, что Flex имеет доступ к двоичным сокетам. Однако есть раздражение, которое вы видели. Сначала он попытается подключиться к порту 843 на хосте, чтобы получить файл политики и посмотреть, разрешено ли соединение. Однако, если время подключения истекло (и оно позволяет получить ответ только 3 секунды), оно подключится к порту сервера и запросит файл политики (отправив ). Он считывает результат и, если соединение считается приемлемым, снова подключается к серверу для прохождения «реального» протокола.

Если файловый сервер политики на 843 не гарантирует быстрого ответа, всегда существует вероятность того, что приложение Flex выполнит запрос файла политики на порт сервера. Это реальная проблема развертывания для существующих служб, но не так уж и плохо, если вы настраиваете сервер самостоятельно, и в этом случае вам просто нужно убедиться, что запрос файла политики можно разумно отличить от любого начального запуска вашего протокола. 1003 *

Файл политики, который я отправлял обратно, выглядит примерно так:

<?xml-version="1.0"?>
<cross-domain-policy>
  <allow-access-from domain="*" to-ports="1492"/>
</cross-domain-policy>

Ваш выглядит довольно близко, за исключением тега управления сайтом, который, я не думаю, уместен.

Чрезвычайно полезно включить ведение журнала запросов файлов политик, чтобы вы могли получить представление о том, чем занимается Flex. Вот как я делаю это на моей машине Vista; пути будут отличаться в XP, но я надеюсь, что по крайней мере это описание даст вам термины веб-поиска для работы.

Сначала установите отладочную версию проигрывателя Flash.

Включите ведение журнала, введя:

ErrorReportingEnable=1
TraceOutputFileEnable=1
PolicyFileLog=1
#PolicyFileLogAppend=1  # optional but possibly useful

В C: /Users/George/mm.cfg

Теперь вы должны увидеть два файла в C: \ Users \ George \ AppData \ Roaming \ Macromedia \ Flash Player \ Logs ":

flashlog.txt
policyfiles.txt

policyfiles.txt - это то, на что вы хотите посмотреть, какие файлы политики были получены и как Flex решил на них ответить. flashlog.txt также очень полезен для захвата вывода trace (), но вы все равно можете получить его из IDE.

Еще одна вещь. Добавление прослушивателей событий в сокет полезно, чтобы помочь отличить ошибки типа ввода-вывода от нарушений политики безопасности. Вот события, которые я слушаю:

socket.addEventListener(Event.CONNECT, ServerConnect);
socket.addEventListener(Event.CLOSE, ServerClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, ServerIOError);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError);
...