Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация Socket сервера для Flash, Delphi сервер - Flash клиент 
:(
    Опции темы
yogin
Дата 22.3.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Приветствую!
Пишу Delphi сервер - Flash клиент.
Долго парился с файлом политик... В результате, при подключении флешки от так:
Код

...
public class Main extends MovieClip {
 
        var address: String = "127.0.0.1";
        var port: int = 5000;
        var socket = new Socket();
 
        public function Main() {
            toggle_visible_btn.addEventListener(MouseEvent.CLICK, onToggleVisible, false, 0, true);
            socket.addEventListener(Event.CLOSE, sockClose);
            socket.addEventListener(Event.CONNECT, sockConnect);
            socket.addEventListener(ProgressEvent.SOCKET_DATA, sockSended);
            socket.addEventListener(IOErrorEvent.IO_ERROR, sockIOError);
            socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, sockSecurityError);
        }
 
        //
        private function onToggleVisible(evt: MouseEvent):void {
            trace("connection pressed");
            //Security.loadPolicyFile(ht);
            socket.connect(address, port);
        }
 
        private function sockClose(evt: Event): void {
            trace("sock closed");
        }
 
        private function sockConnect(evt: Event): void {
            trace("sock connected");
        }
 
        private function sockSended(evt: ProgressEvent): void {
            trace("sock sended");
        }
 
        private function sockIOError(evt: IOErrorEvent): void {
            trace("sock IO error!");
        }
 
        private function sockSecurityError(evt: SecurityErrorEvent): void {
            trace("sock security error!");
        }
    }
...

На сервер сразу идёт строка:
Код

'<policy-file-request/>' + #0(нулевой байт)

Я её принимаю, и в ответ посылаю следующую строку(файл политик):
Код

'<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" secure="false" />
</cross-domain-policy>' + #0;

При таком раскладе мне наконец-то удалось избежать всяких ошибок на стороне флешки по поводу недопустимости файла политик и всякого такого...
И после этого соединение у флешки сохраняется, выводится trace "sock connected". Вроде всё корошо, как бы общайся дальше данными.
Но, взглянем в лог сервера:
[02:49:15]: +++ Сервер запущен +++
[02:50:15]: from 127.0.0.1:51105: Соединение установлено!
[02:50:15]: from 127.0.0.1:51105: принят <policy-file-request/>
[02:50:15]: from 127.0.0.1:51105: Клиент закрыл соединение(закрыт сокет)
[02:50:15]: from 127.0.0.1:51105: Нить остановлена
[02:50:15]: from 127.0.0.1:51107: Соединение установлено!
...
Т.е. флэш клиент, после того как получил файл политик, разрывает соединение и устанавливает его заново!
А чуть позже я увидел пост о том, что можно держать сервер, который раздаёт только файлы политик и больше ничего, вообще отдельно от основного сервера, но как тогда посылать запрос файла политик, ведь тут я просто конектюсь к основному серверу, а флешка уже сама запрашивает у этого адреса файл политик.
нужно воспользоваться Security.loadPolicyFile() ? тогда что правильно писать в скобках, т.е. как правильно писать адрес сервера для такого сокет сервера как у меня? а то примеры котоыре я видел в основном для веб севреров или ещё чего-то...

Теперь идём дальше, допустим что я наладил первое подключение по вышежелаемой схеме.
Теперь, какими данными общаться с основным сервером?
У меня такое мнение слаживается, что общаться прийдётся строками, которые заканчиваются на нулевой байт... Т.е. я опять же видел упоминание этого на каком-то форуме, что: "флеш отправляя строку серверу, всегда в конец добавляет нулевой байт" - типа этот байт служит нам флагом для разделения пакетов на сервере. и далее: "так же и серверу необходимо отсылать строки, добавляя в конец нулевой байт" - типа флешка так тоже автоматом распознает отдельные пакеты и выдаст их в функцию обработки события ProgressEvent.SOCKET_DATA.

Но во всех сетевых приложениях, которые я разрабатывал до этого, я общался следующей структурой:
Код

// определённая структура заголовка пакета
TPackHeader = record
  PackName      : TPackNameType;  // числовое значение - идентификатор типа пакета
  PackBodySize  : TPackBodyType;  // 4 byte(int32) размер массива байт, который идёт сразу после заголовка пакета
end;

Т.е. когда подключается клиент, то анализатор буфера сокета заранее знает, что первым будет заголовок, потом в заговке он читает размер тела пакета и после приёма байт тела опять переключается на чтение заголовка(следующего пакета) и т.д.
А с флешем получается только строки можно передавать чтоли? Конечно я могу адаптировать посылку и приём для строк, в этом случае разделителями пакетов будут нулевые байты, но мне бы всётаки хотелось формировать байтовые пакеты и посылать их как массивы байт, какими я и пользовался...

Ещё интересует отличие типа socket и XMLSocket во флеше... в чём разница, когда тот или другой применяется или может применяться?
я, например, использую:
Код

var socket = new Socket();

А т.к. конечная цель - это рпиложение для вконя(вконтакте), то заодно спрошу, какую строку политики надо использовать для него?
Вот такую?:
Код

<?xml version="1.0"?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-http-request-headers-from domain="vk.com" headers="*"/>
<allow-http-request-headers-from domain="*.vk.com" headers="*"/>
<allow-http-request-headers-from domain="vkontakte.ru" headers="*"/>
<allow-http-request-headers-from domain="*.vkontakte.ru" headers="*"/>
<allow-access-from domain="vk.com" to-ports="80" />
<allow-access-from domain="*.vk.com" to-ports="80" />
<allow-access-from domain="vkontakte.ru" to-ports="80" />
<allow-access-from domain="*.vkontakte.ru" to-ports="80" />
</cross-domain-policy>

Вот вообщем хочется подробно, последовательно обсудить данную архитектуру, а то как-то уже запарило лазить по всему инету и анализировать всякие клочки информации.
Ах да, подскажите ещё, какую книгу взять, где бы по сокетам(в AS3) добротно было расписано(чтоб не только про то, как с WEB серверам связываться)?

Очень надеюсь на помощь
PM MAIL   Вверх
Simplifier
Дата 26.3.2012, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 18.7.2011

Репутация: нет
Всего: нет



Ну да, loadPolicyFile должен помочь. В справку загляни (http://help.adobe.com/ru_RU/FlashPlatform/...oadPolicyFile()) - там все описано. Ничего особенного в твоем сервер-сокете вроде нет, загружаешь кроссдомен, как в справке сделано: 
Код
Security.loadPolicyFile(address+':'+port);
 Вызывай этот метод при старте приложения (в Main) и все

Цитата

А с флешем получается только строки можно передавать что ли?

С чего ты взял? Опять же, в хелпе все написано: http://help.adobe.com/ru_RU/FlashPlatform/...net/Socket.html . Там до фига чего передавать можно и в каком хочешь виде: и всяко-разные строки, и числа, и байты, и сериализованные объекты.

Цитата

Ещё интересует отличие типа socket и XMLSocket во флеше... в чём разница, когда тот или другой применяется или может применяться?

http://help.adobe.com/ru_RU/FlashPlatform/.../XMLSocket.html . Вот XMLSocket (не зря он так называется) как раз, в отличие от Socket специально предназначен для обмена текстовыми данными.

Если что, деректива <allow-http-request-headers-from domain="*.vk.com" headers="*"/> шире чем <allow-http-request-headers-from domain="vk.com" headers="*"/>, поэтому половину строк можно безболезненно удалить.
Вот спецификация кроссдомена: http://learn.adobe.com/wiki/download/attac...ecification.pdf

Не слишком подробно, но довольно внятно работа с сокетами описана в книжке ActionScript 3 Сборник рецептов

Это сообщение отредактировал(а) Simplifier - 26.3.2012, 18:04
PM MAIL   Вверх
yogin
Дата 27.3.2012, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



О наконец-то по кроссдоменам что-то внятное и подробное, благодарствую за PDF'ку и наводку на книжку.
PM MAIL   Вверх
Simplifier
Дата 27.3.2012, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 18.7.2011

Репутация: нет
Всего: нет



=)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.1094 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.