Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Скоро повешусь с <policy-file-request/> (http://www.flasher.ru/forum/showthread.php?t=205935)

MBoY4ik 01.01.2014 21:34

Скоро повешусь с <policy-file-request/>
 
Пишу сервак на java. Поставил ServerSocket на 843 порту. Идет соединение и отправляется файл политики.

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

с \u0000 на конце.

Но флеш не посылает нужные мне строки на сервер после принятия файла политики. Либо я передаю че-то не правильно... либо я передаю че-то не правильно! Помогите плиз.

bav 01.01.2014 22:43

Закрывает ли сервер соединение с клиентом после отправки ему политики?
Вот кроссдоменник:
Код:

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

Вот короткий скрипт на Python:
Код:

import socket

cross = open('crossdomain.xml').read()

HOST = ''
PORT = 843
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(32)
while 1:
        conn, addr = s.accept()
        data = conn.recv(24)
        print 'Connected by', addr, data
        if not data:
                conn.close()
        else:
                conn.sendall(cross)
                conn.close()


caseyryan 02.01.2014 00:07

Механизм должен быть такой: флеш коннектится, получает файл политики, соединение закрывается сервером. Это должно быть сделано обязательно! А дальше можно уже производить новый коннект на любой другой порт.
То есть сервер логичнее всего разбить на 2 части. Чисто часть которая занимается отправкой файлов политики, и часть которая обрабатывает все остальное.

MBoY4ik 03.01.2014 23:24

Цитата:

Сообщение от caseyryan (Сообщение 1156318)
Механизм должен быть такой: флеш коннектится, получает файл политики, соединение закрывается сервером. Это должно быть сделано обязательно! А дальше можно уже производить новый коннект на любой другой порт.
То есть сервер логичнее всего разбить на 2 части. Чисто часть которая занимается отправкой файлов политики, и часть которая обрабатывает все остальное.

Я вроде-как все это сделал:
Код AS3:

import flash.system.Security;
import flash.net.Socket;
import flash.events.Event;
import flash.events.SecurityErrorEvent;
 
 
try
{
        Security.loadPolicyFile("xmlsocket://localhost:843");
        var socket:Socket = new Socket();
}catch(e:SecurityErrorEvent){
        txt.text = e.text;
}
socket.connect("localhost",8010);
socket.writeUTFBytes("ALL OK!!!");

Все ли я правильно сделал?

Если swf не залит на серв, то лог сервера такой:

8010: CONNECT
DATA: ALL OK!!!
8010: DISCONNECTED BY SERVER

а если залит, то такой:

843: CONNECT
843: NEED POLICY FILE
843: DISCONNECTED BY SERVER
8010: CONNECT

ошибку не выдает
не понимаю я этого адобовского юмора security

bav 03.01.2014 23:45

Если у вас на 843 порту сервера висит и слушает секьюрный скрипт, вроде того, что я привел, то достаточно на клиенте выполнить следующее:
Код AS3:

// Создаем сокет
_socket = new Socket();
// Определяем порядок байт
_socket.endian = Endian.LITTLE_ENDIAN;
// Добавляем прослушку события подключения. Только после наступления
// этого события можно слать/принимать данные.
_socket.addEventListener(Event.CONNECT, connectHandler);
// Добавляем прослушку прочих событий.
_socket.addEventListener(Event.CLOSE, closeHandler);
_socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
_socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
 
// Начинаем установку соединения. Здесь _port - это не 843, а уже целевой
// порт сервера (например, 8010, в вашем случае).
_socket.connect(_host, _port);
 
// Функция connectHandler выглядит примерно так:
function connectHandler(e:Event):void
{
        // Здесь просто вывод сообщения о том, что соединение установлено.
        Debug.out("Connection established.");
}

То есть, как видите, вызов Security.loadPolicyFile("xmlsocket://localhost:843") не нужен. Честно признаться, я не знаю зачем он нужен, кто знает расскажет. После вызова метода _socket.connect Flash Player самостоятельно постучится на 843 порт и спросит файл политик. Удовлетворившись, он уже подключится на целевой порт, и после удачной установки соединения бросит событие Event.CONNECT, которое мы как раз и слушаем.

alexcon314 05.01.2014 23:21

loadPolicyFile не приводит к немедленной загрузке файла политик из альтернативного источника. Это указание на дополнительное действие "возьми-ка политики не только с 843 порта, а еще и тут до кучи, когда будешь коннектиться к серверу".
В этом контексте Security.loadPolicyFile("xmlsocket://localhost:843"); - бессмысленный код (да еще и в try-catch).
Более того, видимо, вредный :): после возможно успешного дефолтного запроса на 843 порт, сервер закрывает коннект, а плеер, согласно указанию в коде, опять туда стучится, но таймаутов тут уже нет и клиент успешно засыпает в ожидании "дополнительных" политик. Шутка, но в каждой шутке есть доля сами знаете чего.
Протестите сервер на предмет отдачи политик и уберите loadPolicyFile, воспользуйтесь примером bav'a создания коннекта с подпиской на события. И да, самостоятельный демон-скрипт, которые спокойно слушает 843 порт, раздает политики, и позволяет не забивать себе голову этим "юмором" - тоже отличная идея.
_________

И еще, эмоции эмоциями, но вот ругань в заголовке темы, равно как и в постах, крайне не приветствуется.

maxkar 11.01.2014 20:33

Цитата:

Сообщение от MBoY4ik (Сообщение 1156402)
Я вроде-как все это сделал:
Код AS3:

socket.connect("localhost",8010);
socket.writeUTFBytes("ALL OK!!!");


Так нельзя. Оно не будет работать. Во второй строке будет исключение IOError, так как соединение устанавливается асинхронно. Вы должны ловить событие Event.CONNECT и уже там отправлять ваши данные. В качестве основы можно взять код от bav.

И заодно разберитесь с исключениями и событиями. SecurityErrorEvent не выбрасывается штатными функциями, это событие, на него нужно подписываться.


Часовой пояс GMT +4, время: 10:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.