Unhandled Socket securityError, даже когда (на первый взгляд) обрабатывает его - PullRequest
2 голосов
/ 17 ноября 2008

У меня возникла проблема, когда я иногда (то есть не всегда) вижу всплывающее окно с ошибкой отладчика Flash Player после запуска моего приложения:

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: http://example.com/myApp.swf cannot load data from localhost:4499.
    at org.mydomain.mypackage::MyClassUsingSocket()
    at MyMainApplicationClass$cinit()
    at global$init()
    at global$init()
    at flash.system::ApplicationDomain/hasDefinition()
    at mx.managers::SystemManager/getDefinitionByName()
    at _MyMainApplicationClass_mx_managers_SystemManager/create()
    at mx.managers::SystemManager/initializeTopLevelWindow()
    at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()

У меня есть некоторый код в этом приложении, который пытается подключиться к localhost:4499 через Socket, и эта ошибка возникает, когда сервер сокетов не работает и прослушивает соединения, , что и следовало ожидать . Однако я не понимаю, что почему Flash Player жалуется на необработанные ошибки securityErrors, когда у меня есть блоки try / catch для перехвата SecurityError s при попытке подключить сокет (а также прослушиватели для SecurityErrorEvents, на которые это сообщение об ошибке, похоже, не указывает).

Конструктор соответствующего класса находится ниже:

/**
* Constructor.
*/
public function MyClassUsingSocket(aHost:String = null, aPort:int = -1):void
{
    super();

    var hostToConnectTo:String = (aHost != null) ? aHost : DEFAULT_HOST;
    var portToConnectTo:int = (aPort != -1) ? aPort : DEFAULT_PORT;


    try
    {
        _out_socket = new Socket();

        // note: the event handlers used below are private functions within the same class
        _out_socket.addEventListener(Event.CONNECT, _socketConnectEventHandler, false,0,true);
        _out_socket.addEventListener(IOErrorEvent.IO_ERROR, _socketIOErrorEventHandler, false,0,true);
        _out_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _socketSecurityErrorEventHandler, false,0,true);

        _out_socket.connect(hostToConnectTo, portToConnectTo);
    }
    catch(e:IOError)
    {
        enabled = false;
    }
    catch(e:SecurityError)
    {
        enabled = false;
    }
}

Есть идеи о том, почему это может происходить? Чего мне не хватает?

Ответы [ 4 ]

4 голосов
/ 23 июня 2009

Я тоже боролся с этим пару часов. Решение заключается в прослушивании SecurityErrorEvent.SECURITY_ERROR. Очевидно, что ошибка SecurityError возникает только в том случае, если такой обработчик событий отсутствует.

0 голосов
/ 18 ноября 2008

Выстрел в темноте: попробуйте отловить общую ошибку?



        try
        {
                _out_socket = new Socket();

                // note: the event handlers used below are private functions within the same class
                _out_socket.addEventListener(Event.CONNECT, _socketConnectEventHandler, false,0,true);
                _out_socket.addEventListener(IOErrorEvent.IO_ERROR, _socketIOErrorEventHandler, false,0,true);
                _out_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _socketSecurityErrorEventHandler, false,0,true);

                _out_socket.connect(hostToConnectTo, portToConnectTo);
        }
        catch(e:IOError)
        {
                enabled = false;
        }
        catch(e:SecurityError)
        {
                enabled = false;
        }
        catch( e:Error )
        {
                trace( e );
        }
0 голосов
/ 01 декабря 2008

Я не думаю, что ошибки, отображаемые в диалоговом окне, являются синхронными. Я почти уверен, что они выбрасываются за пределы вашего пути кода (во время асинхронного сетевого события), поэтому перехватить их с помощью try-catch невозможно.

То есть вы думаете, что прослушивание правильного события в правильном диспетчере уловит ошибку? Я попытался прослушать сцену, корень, объект (сокет), но ничего не подавляет ошибку.

Да, это довольно ужасно. Я давно искал способ поймать этих маленьких тварей. Единственное утешение заключается в том, что я думаю, что это отключено в релизной версии плеера. Тем не менее, это загадочно, да? Не так много документации (что я нашел).

Это не совсем ответ. К сожалению.

0 голосов
/ 18 ноября 2008

Возможно, это не проблема, но вы ловите SecurityError и его бросок securityError Может быть, попробуйте нижний регистр s.

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