Почему установка 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, чтобы другие люди могли проверить результат. И скажите нам, какую платформу вы используете.