AS3 - Как узнать, когда у Socket больше нет данных для возврата? - PullRequest
0 голосов
/ 21 октября 2011

Я пытаюсь установить связь, используя этот протокол.Он отлично работает, за исключением случаев, когда сокет имеет много данных для возврата.Прямо сейчас я проверяю, заканчивается ли пакет на \ r \ n, чтобы определить, получил ли я все пакеты.Проблема в том, что иногда пакет может заканчиваться на \ r \ n разрывом строки, даже если это не последний пакет, поэтому я не могу его использовать.

Я использую очередь команд, потому что хочудождитесь полного ответа, прежде чем отправлять следующую команду.

Код с удаленным ненужным материалом:

class CustomSocket extends Socket
{

    private var _response:String;
    private var _commandQueue:Array;

    public function CustomSocket()
    {
        super();
        this.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
    }

    private function socketDataHandler(event:ProgressEvent):void 
    {
        readResponse();
    }

    private function readResponse():void {
        var str:String = this.readUTFBytes(bytesAvailable);
        _response += str;
        //BUG: I cannot use this check for determining the end of packets, need to find a new one
        if (_response.charAt(_response.length - 1) == "\n" && _response.charAt(_response.length - 2) == "\r")
        {
            //dispatch the result
            commandFinished();
        }
    }

    //writes to the socket
    private function sendRequest(request:String):void 
    {
        _response = "";
       this. writeln(request);
        flush();
        writeln("\r\n");
        flush();
    }

    private function writeln(str:String):void 
    {
        try
        {
            this.writeUTFBytes(str);
        }
        catch (e:IOError) 
        {
            trace(e);
        }
    }

    private function addCommand():void
    {
        //adds a command to the queue and executes it
    }

    private function commandFinished():void
    {
        //remove executed command and check if there is more commands in the queue to execute
    }
}

Проблема в функции readResponse.Я много гуглил, не находя ничего интересного.

Есть ли способ узнать общее количество байтов / пакетов, возвращаемых сокетом?Или способ обнаружить EOF или что пакет последний?

Ответы [ 2 ]

0 голосов
/ 22 октября 2011

Возможно, вы ищете свойство bytesAvailable в Socket. Как в:

while( socket.bytesAvailable )
    socket.readBytes( myByteArray );

Для более полного решения (в том числе, где можно получить несколько сообщений одновременно), я ответил на это в другом вопросе: AS3 / AIR readObject () из сокета - как проверить, все ли данные были получены?

0 голосов
/ 21 октября 2011

Как правило, нулевой символ отправляется в конце данных, которые вы отправляете.
Это дает вашему серверу определенный символ для поиска.

this.writeln(request + String.fromCharCode(0) );

И просто, чтобы вы знали
У вас есть пробел после точки в функции sendRequest в этой строке

this. writeln(request);

И вы также можете попробовать это для обработки ошибок.

if(this.connected){
  this.writeln(request + String.fromCharCode(0) );
  this.flush();
}else{
  // do your error handling for no connection to server
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...