Как ваш клиент узнает, когда законченное сообщение было прочитано? Если он должен читать до тех пор, пока входной поток не достигнет своего конца, то, по определению, вы все равно ничего не сможете прочитать из потока впоследствии. Во-вторых, вызов close()
во входном потоке не должен закрывать сокет. Вы уверены, что сокет закрывается при вызове close()
во входном потоке? Может быть, соединение (неправильно) закрыто узлом, когда он замечает, что его выходной поток (ваш входной поток) был закрыт.
Решение, позволяющее избежать чтения до конца входного потока, заключается в том, чтобы как-то разграничить входное сообщение. Например, вы можете отправить длину сообщения перед сообщением, затем прочитать все сообщение из потока в буфер, затем проанализировать буфер с помощью XMLReader или создать специальный InputStream, который принимает свой конец, который достигает своего конца после указанного количества данные. Или вы можете добавить специальный разделитель в поток после сообщения, а затем создать специальный InputStream, который достигает своего конца, когда базовый поток создает разделитель.