Гнездо Flex - PullRequest
       13

Гнездо Flex

1 голос
/ 26 декабря 2011

У меня есть Groovy-сервер и клиент Flex.Когда я пытаюсь подключиться из Flex к приложению Groovy, я получаю сообщение <policy-file-request/>.Затем я отправляю какой-то политический XML-ответ и пытаюсь что-то отправить на сервер.Но вместо того, чтобы получать что-то на Groovy, я не получаю абсолютно ничего.И через несколько секунд я получаю SecurityException на стороне приложения Flex.

Код Groovy-сервера:

import java.util.Scanner

class server
{
    public static handleConnection(client)
    {
        PrintWriter socketwriter = new PrintWriter(client.getOutputStream())

        Scanner socketreader = new Scanner(client.getInputStream())

        while (socketreader.hasNext())
        {
            String s = socketreader.nextLine()

            println s

            if (s =~ /<policy-file-request\s*\/>/)
            {

                socketwriter.print("<?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=\"*\" to-ports=\"2900-2910\" /></cross-domain-policy>\n\0\n")

                socketwriter.flush()
                socketwriter.close()
                client.close()

                println "Policy File sent."

                return
            }
        }

        socketwriter.print("Connection: Done.\n")
        socketwriter.flush()

        socketwriter.close()
        socketreader.close()
    }

    static main(args)
    {
        ServerSocket serversocket

        try
        {
            serversocket = new ServerSocket(2900)

            println "Server is up and running"

            while (true)
            {
                Socket client = serversocket.accept()

                Thread.start {
                    server.handleConnection(client)
                }
            }
        } catch (e)
        {
            e.printStackTrace()
        } finally
        {
            serversocket.close()
        }
    }
}

Код клиента Flex:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import flash.net.Socket;
            import flash.events.*;
            import mx.controls.Alert;

            private var socket : Socket;

            private function connect() : void 
            {
                socket = new Socket();

                socket.addEventListener(Event.CONNECT, onConnect);
                socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
                socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError);

                socket.connect("localhost", 2900);

                Alert.show("yay!");
            }

            private function ServerSecurityError(evt : Event) : void
            {
                Alert.show("security error")
            }

            private function onConnect(evt : Event) : void
            {
                Alert.show("Connected to server!");
            }

            private function onSocketData(evt : ProgressEvent) : void
            {
                var data : String = socket.readUTFBytes(socket.bytesAvailable);
                Alert.show("Read: " + data);
            }

            private function send() : void 
            {
               var msg : String = "Hello, World!";
               socket.writeUTFBytes(msg);
               socket.flush();
               Alert.show("Sent: " + msg);
            }
        ]]>
    </mx:Script>

    <mx:Button label="connect" click="connect()" x="10" y="10" />
    <mx:Button label="send something" click="send()" x="10" y="40" />
</mx:Application>

Итак, вопрос: Как мне подключиться, чтобы получить стабильную связь между сервером и клиентом?

1 Ответ

2 голосов
/ 26 декабря 2011

A SecurityError возникает по следующим причинам (из документов):

  • Локальные ненадежные SWF-файлы не могут обмениваться данными с Интернетом.Вы можете обойти это ограничение, переклассифицировав файл как локальный с сетевым подключением или как доверенный.
  • Нельзя указать порт сокета выше 65535.
  • На странице HTML, содержащей содержимое SWF, для параметра allowNetworking объекта и тегов внедрения установлено значение «none».

Мы выполняем аналогичную настройку (используя чистый интерфейс AS3), и прежде чем я позвоню на connect(), я звоню:

Security.loadPolicyFile( "xmlsocket://" + this.m_host + ":" + this.m_policyFilePort );

где m_host может быть чем-то вроде "localhost", а m_policyFilePort - любым портом, на котором вы его обслуживаете.Вы можете найти более подробную информацию о ней здесь или в файлах сокетов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...