Как заставить мой PHP Socket Server отправлять файл политики флэш-клиентам?

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

Вот что я сделал.

В ActionScript/Flex 3/Flash:

Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");
socket.connect(hostName, port); //connect to the socket
[rest of original code]

Чтобы сервер сокетов отвечал на запрос, я добавил на сервер следующее:

elseif (preg_match("/policy-file-request/i", $buffer) or preg_match("/crossdomain/i", $buffer)) {
                    socket_write($socket, '<?xml version="1.0"?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-access-from domain="*" to-ports="9000" /></cross-domain-policy>');
                    unset($read_sockets[array_search($socket, $read_sockets)]);
                    socket_shutdown($socket, 2);
                    socket_close($socket);

Однако я получаю следующую ошибку: «Игнорирование файла политики по адресу (URL) из-за отсутствия Content-Type». Итак, я попытался исправить это, добавив заголовок прямо над моим XML-кодом:

socket_write($socket, "Content-Type: text/xml\n");

К сожалению, я все еще получаю ту же ошибку. Я неправильно указываю тип контента?


person Tom    schedule 04.07.2009    source источник


Ответы (5)


Попробуйте отправить это:

HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\n\r\n

Убедитесь, что перед этим ничего не отправлено. Кроме того, отправьте \r\n до закрытия сокета.

person Mauricio    schedule 06.07.2009
comment
HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\n\r\n у меня не работает. HTTP/1.1 200 OK\r\nContent-Type: text/xml\n\n сделал. - person Mitchell; 28.06.2012

Вам нужно вернуть действительный ответ HTTP, если вы собираетесь использовать:

Security.loadPolicyFile("http://[SERVER.IP]:9000/crossdomain.xml");

Если флэш-память собирается подключиться к вашему серверу сокетов PHP, просто пропустите указанную выше строку, и она попробует сам порт и будет ожидать необработанные данные вместо ответа HTTP.

person truppo    schedule 04.07.2009
comment
Кажется, это не так. Как заставить его возвращать действительный ответ HTTP? - person Tom; 04.07.2009

вы можете загрузить файл политики с любого порта сервера, используя Security.loadPolicyFile() ... возможно, вам следует просто передать его через http на порт 80, загрузить его оттуда, а затем подключиться к серверу ...

также по умолчанию, я думаю, что flashplayer 9 (начиная с какой-то второстепенной версии) по умолчанию отправляет запрос файла политики на порт 943 ... так что вы можете разместить там сервер, чтобы сделать это ...

небольшое примечание: PHP никогда не разрабатывался для серверов сокетов и не очень хорош в этом... если можете, попробуйте использовать Java или NekoVM, который вы можете использовать с Haxe... а также удаленное взаимодействие Haxe и ThreadedRemotingServer. представлять для вас интерес ... на сайте Haxe есть несколько хороших и понятных туториалов ...

person back2dos    schedule 04.07.2009
comment
Я не могу использовать такие низкие порты (ограничено моим веб-хостом). - person Tom; 04.07.2009

Попробуйте использовать \r\n после Content-Type.

socket_write($socket, "Content-Type: text/xml\r\n");

Разве вы не должны использовать xmlsocket на порту 843?

person Mauricio    schedule 04.07.2009
comment
Я не могу использовать такие низкие порты (ограничено моим веб-хостом). - person Tom; 04.07.2009
comment
Только что попробовал, и я все еще получаю ту же ошибку, когда добавляю \r\n после Content-Type. - person Tom; 05.07.2009

if(trim($buffer) == '<policy-file-request/>') {
$policy_file =
    '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'.
    '<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd">'.
        '<allow-access-from domain="*" to-ports="*" secure="false" />'.
        '<site-control permitted-cross-domain-policies="master-only" />'.
    '</cross-domain-policy>';

socket_write($socket, $policy_file.chr(0));
}

у меня работает нормально, клиент запросит файл политики, отключится, а затем снова подключится после получения файла политики

person Thomas    schedule 18.11.2010