Связь гнезда Flex / AIR - Flex никогда не получает данные - PullRequest
1 голос
/ 11 августа 2011

У меня есть flex .swf и отдельный проект AIR, с которым я пытаюсь связаться друг с другом через сокет.

Две программы подключены нормально, и .swf может без проблем отправлять данные в приложение AIR. Однако я обнаружил, что когда приложение AIR отправляет данные обратно во Flex, они никогда не принимаются.

  • .swf запускается локально через file:// URI в браузере.
  • .swf подключается, и событие CONNECT запускается
  • Я добавил точки останова для поиска запросов на файл политики, как это было предложено здесь , но я никогда не видел, чтобы запрос на файл политики выдавался из SWF-файла в приложение AIR.

Вот фрагмент кода, который я запускаю из SWF для прослушивания данных:

    private var address:String;
    private var port:int;
    private var socket:Socket;
    private var log:ILogger = LogUtil.getLogger(this);

    public function SocketPlayer(port:int=41051,address:String="127.0.0.1")
    {
        this.port = port;
        this.address = address;
        connect();
    }
    public function connect():void
    {
        socket = new Socket();
        socket.addEventListener(DataEvent.DATA,onData);
        socket.addEventListener(Event.CLOSE,logEvent);
        socket.addEventListener(Event.CONNECT,logEvent);
        socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,logEvent);
        socket.addEventListener(IOErrorEvent.IO_ERROR,logEvent);
        socket.connect(address,port);
        log.info("Socket connected on {0}:{1}",address,port);
    }
    private function logEvent(event:Event):void
    {
        log.info("Event: {0}", ObjectUtil.toString(event));
        if (event is TextEvent)
        {
            log.error(TextEvent(event).text)
        }
    }
    private function onData(event:DataEvent):void
    {
        log.info("Data: " + event.data);
    }

Вот код, используемый в приложении AIR для отправки данных:

    public function execute():void
    {
        var message:String = "Testing...";
        socket.writeUTF(message);
        socket.flush();
    }

(Обратите внимание, что socket хранится локально, как передано в ServerSocketConnectEvent, хотя этот код здесь не показан)

Если я помещаю точку останова в код, отправляемый в SWF, я замечаю, что сокет имеет частное свойство _timeoutEvent, которое устанавливается на экземпляр flash.events.SecurityErrorEvent со следующим текстом ошибки:

Error #2048: Security sandbox violation: file:///Users/martypitt/dev//ParsleyTest/bin-debug/RecordingTest.swf cannot load data from 127.0.0.1:41051.

Однако SecurityErrorEvent никогда не перехватывается моим кодом (я не уверен, означает ли это, что он действительно когда-либо отправлялся).

Какие дополнительные шаги мне нужно предпринять, чтобы разрешить это общение?

1 Ответ

1 голос
/ 11 августа 2011

Ой, проблема в том, что я слушаю не то событие.

Я должен слушать ProgressEvent.SOCKET_DATA вместо DataEvent.ON_DATA, так как это Socket, а неXMLSocket.

...