Мы интегрируемся с внешним продуктом, который требует от нас взаимодействия с ним с помощью сокетов Java.Мы смогли прочитать небольшие ответы с сервера без проблем, но большие ответы вызывают некоторые головные боли.
Я внес некоторые изменения в логику обработки сокетов, и теперь мы, кажется, можем читать большие ответы 90%время.Это все еще иногда терпит неудачу.Отказ в этом случае означает, что клиент Java прекращает чтение из сокета до того, как будет прочитан весь ответ.Клиент считает, что операция чтения завершена, и нормально останавливается - никаких исключений или тайм-аутов не происходит.
Вот как выглядит текущая логика:
StringWriter response = new StringWriter();
PrintWriter writer = new PrintWriter(response);
char[] buf = new char[4096];
int readChars;
do {
readChars = responseBufferedReader.read(buf);
writer.write(buf, 0, readChars);
} while(readChars != -1 && responseBufferedReader.ready());
responseBufferedReader
- это BufferedReader
обернутый вокруг InputStreamReader
, обернутый вокруг Socket
InputStream
.
Этот код работает большую часть времени, но кажется, что проверка на readChars != -1
и ready()
не достаточно надежна, чтобы указать, если мыпрочитал весь контент с сервера.Сравнение количества прочитанных символов с размером буфера также ненадежно, так как сервер, кажется, немного медленно отправляет ответ, что приводит к разнице этих чисел.
Я попытался изменить размер буфера символов;это помогло, но все еще не работает в 100% случаев.
Есть ли лучший и более надежный способ читать полностью из Socket
, не зная размера ожидаемого ответа?Я провел некоторое исследование на SocketChannel
s, но я не уверен, есть ли какая-то польза от переключения.
В случае, если это поможет, мы создаем одно, блокирующее Socket
соединение ссервер.Socket
настроен на тайм-аут на 100 секунд