Android - время ожидания сокета - PullRequest
3 голосов
/ 18 октября 2010

У меня странное поведение сокета.Я установил тайм-аут 5 секунд, используя setSoTimeout.Это должно быть достаточно времени в моей ситуации.Согласно онлайновой документации Java, SocketTimeoutException должно быть выброшено, если оно истекло.Это также говорит, что сокет все еще действителен.Поэтому я хочу поймать это, а затем продолжить.Однако вместо внутреннего улова внешний улов IOException перехватывает исключение, и когда я выводлю в журнал подробности, он говорит, что это был SocketTimeoutException.Еще одна непонятная вещь - я изменяю время ожидания с 5 секунд до 15 секунд и записываю количество времени, которое требуется для каждого чтения, время всегда находится в миллисекундном диапазоне, даже не близко к секунде.Любые идеи приветствуются.

ReadThread фрагмент кода

@Override
public void run()
{
    try
    {
        while (true)
        {
            byte[] sizeBuffer = new byte[BYTES_FOR_MESSAGE_SIZE];

            int bytesRead = this.inputStream.read(sizeBuffer);

            int length = 0;

            for (int i = 0; i < BYTES_FOR_MESSAGE_SIZE; i++)
            {
                int bitsToShift = 8 * i;
                int current = ((sizeBuffer[i] & 0xff) << bitsToShift);
                length = length | current;
            }

            byte[] messageBuffer = new byte[length];


            this.socket.setSoTimeout(5000); //5 second timeout

            try
            {
               this.inputStream.read(messageBuffer);
            }
            catch(java.net.SocketTimeoutException ste)
            {
               Log.e(this.toString(), "---- SocketTimeoutException caught ----");
               Log.e(this.toString(), ste.toString());
            }

        }
    }
    catch (IOException ioe)
    {
       Log.e(this.toString(), "IOException caught in ReadThread");
       Log.e(this.toString(), ioe.toString());
       ioe.printStackTrace();
    }
    catch (Exception e)
    {
       Log.e(this.toString(), "Exception caught in ReadThread");
       Log.e(this.toString(), e.toString());
       e.printStackTrace();
    }

    this.interfaceSocket.socketClosed();

}// end run

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Я согласен с Брайаном.Вы, вероятно, получаете время ожидания при первом чтении, а не во втором.Однажды установленный тайм-аут остается в силе, пока вы не измените его снова.

Ваш второй вызов чтения, когда вы читаете «сообщение», кажется, предполагает (а), что оно прочитает все сообщение, и (б) чтотайм-аут, если все сообщение не приходит в течение 5 секунд.Это не работает так.Время ожидания истекает, если Ничего не поступит в течение 5 секунд, или иначе , будет считано все полученное, вплоть до message.length.Но это может быть только один байт.

Вы должны использовать DataInputStream.readFully() для чтения всего сообщения, и вам необходимо полностью пересмотреть свою стратегию тайм-аута.

1 голос
/ 25 января 2011

Исключение, вероятно, перехватывается при первой попытке catch из-за более раннего вызова this.inputStream.read () У вас есть два из этих вызовов: один во внешней попытке, другой во внутренней попытке.

Проверяли ли вы, читаются ли данные? Если данные читаются, вы должны ожидать, что операция чтения вернется через несколько миллисекунд. Если данные не читаются, операция чтения должна блокироваться на указанное вами время. Возможно, это связано с порядком, в котором вы устанавливаете значение SoTimeout (возможно, это поможет раньше).

Удачи, B-Rad

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