Почему установка SO_TIMEOUT приводит к немедленному возвращению окончательного чтения SocketInputStream?

Я работаю над тестовым комплектом, который записывает байты через сокет на сервер и читает ответ. У меня была проблема, когда последнее чтение InputStream Сокета приостанавливалось на 20 секунд. Я исправил это, но не понимаю, почему это сработало.

Следующий метод получает java.net.SocketInputStream. Вызов read(byte[], int, int) приостанавливался на 20 секунд при окончательном чтении, которое возвращает -1, что указывает на конец потока.

    private String getResponse(InputStream in) throws IOException {

    StringBuffer buffer = new StringBuffer();
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    byte[] data = new byte[1024];
    int bytesRead = 0;
    while (bytesRead >= 0) {
        bytesRead = in.read(data, 0, 1024);    // PAUSED HERE ON LAST READ
        if (bytesRead > 0) {
            bout.write(data, 0, bytesRead);
        }
        buffer.append(new String(data));
    }
    return buffer.toString();
}

Я смог убрать паузу, установив SO_TIMEOUT в сокет. Кажется, не имеет значения, что я установил. Даже при использовании socket.setSoTimeout(60000) проблема, прочитанная в приведенном выше методе, немедленно возвращается в конце потока.

Что тут происходит? Почему установка SO_TIMEOUT, даже высокого значения, приводит к немедленному возвращению окончательного чтения в SocketInputStream?

1 ответ

Решение

Это звучит неправдоподобно. Установка времени ожидания сокета не должно иметь такого эффекта.

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

Если это не поможет, вам нужно будет предоставить SSCCE, чтобы другие люди могли проверить результат. И скажите нам, какую платформу вы используете.

Другие вопросы по тегам