У меня есть 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
никогда не перехватывается моим кодом (я не уверен, означает ли это, что он действительно когда-либо отправлялся).
Какие дополнительные шаги мне нужно предпринять, чтобы разрешить это общение?