Сокеты отключаются автоматически в AS3

Я создал объекты Socket и ServerSocket в as3, затем подключил сокет с помощью метода connect, передав ему хост и порт. Также я сделал объект ServerSocket прослушиванием входящего соединения из сокета, отличного от сокета, который я только что создал. Когда ServerSocket обнаруживает соединение и начинает получать данные, объект сокета автоматически отключается. Итак, я хочу знать, как сохранить соединение в объекте сокета.


person user1167572    schedule 11.03.2012    source источник
comment
Для меня это звучит как проблема безопасности... Есть ли на вашем сервере междоменная политика?   -  person weltraumpirat    schedule 11.03.2012
comment
Я считаю, что @weltraumpirat здесь прав на деньги. Скорее всего проблема с безопасностью. Вы должны убедиться, что когда подключающийся сокет запрашивает файл политики безопасности сокета, вы его обслуживаете, как и должны. Я дам ссылку на ответ, который решит это для вас.   -  person    schedule 12.03.2012


Ответы (1)


Я публикую это как ответ, а не просто ссылаюсь на этот вопрос как на дубликат, потому что ваша проблема не совсем совпадает с вопросом и ответом, на которые я собираюсь ссылаться здесь. Однако ответ, на который я ссылаюсь, предоставляет ресурсы, которые помогут вам понять модель безопасности, стоящую за подключением сокетов, что, как я считаю, является проблемой здесь:

air 2.6 serversocket и actionscript 3 socket connection

Выдержка из связанного ресурса, который демонстрирует «рукопожатие», когда файл политики передается в подключающийся сокет:

private function handshakeHandler( event:ProgressEvent ):void
{
    var socket:Socket = event.target as Socket;

    //Read the message from the socket
    var message:String = socket.readUTFBytes( socket.bytesAvailable );
    logCallback( "Received: " + message);
    if( message == "" )
    {
        var policy:String = '\x00';
        socket.writeUTFBytes( policy );
        socket.flush();
        socket.close();
        logCallback("Sending policy: " + policy);
    } else if ( message == "BEGIN" )
    {
        socket.removeEventListener( ProgressEvent.SOCKET_DATA, handshakeHandler );
        socket.addEventListener( ProgressEvent.SOCKET_DATA, socketDataHandler );
        socket.writeUTFBytes( "READY" );
        socket.flush();
    } 
}

Файл политики, используемый в этом примере:

<cross-domain-policy>
    <allow-access-from domain="*" to-ports="8087" />
    </cross-domain-policy>\x00
person Community    schedule 11.03.2012