У нас есть старое приложение, созданное с использованием Java 6. Оно связывается через сокеты, используя DataInputStream и DataOutputStream.
// Фрагмент кода для записи в поток
public void writeMessage(DataOutputStream out) throws IOException {
int pageSize = 10;
logger.info("pageSize: " + pageSize);
out.writeInt(pageSize);
}
// Фрагмент кода для чтения из потока
public void readMessage(DataInputStream in) throws IOException {
int pageSize = in.readInt();
logger.info("pageSize: " + pageSize);
}
Раньше он работал в jboss как сервер приложений с postgres в качестве БД.
Теперь мы перенесли приложение в Springboot. Он использует встроенный сервер Tomcat и ту же базу данных postgres.
Код не правильно читает из потока. Я получаю java.io.EOFException
, когда звоню in.readInt()
Примечание. Мы используем SSL / TLSv1, и сертификаты и хранилища ключей настроены правильно.
Нет никаких исключений, когда соединение с сокетом установлено и когда я пишу в поток.
Кроме того, все соединения Streams / Socket были закрыты должным образом, и тот же код прекрасно работает на сервере jboss.
РЕДАКТИРОВАТЬ: я пытался использовать InputStream
или BufferedInputStream
вместо DataInputStream
, и результаты еще более запутанные.
Допустим, я отправляю 20 байтов в поток:
При inputStream.read
считывается только 1 байт, и он достигает EOF преждевременно.
С bufferedInputStream.read
19 байтов считываются и 1 байт пропущен.
Я использую inputStream ИЛИ bufferedInputStream, а не один за другим.
Пожалуйста, дайте мне знать, если я что-то упускаю.