Вы, вероятно, создаете тупик.
- Клиент - отправляет данные на сервер.
- Сервер - возвращает данные клиенту.
- Клиент - считывает данные (которые сервер вернул обратно)
Итак, пока клиент отправляет данные на сервер, сервер отправляет их обратно клиенту.
Клиент не читает эти данные, он занят отправкой.
В какой-то момент буферы TCP заполняются, и сервер блокирует отправку дополнительных данных клиенту. Это означает, что сервер заблокирован при отправке данных, поэтому в конечном итоге буферы TCP на принимающей стороне сервера также заполняются, и клиент блокирует при отправке данных. Поскольку клиент теперь блокируется при отправке, он никогда не попадет в ту часть, где он читает зацикленные данные, поэтому сервер никогда не разблокирует.
Если вы отправляете небольшой документ, это может не произойти, поскольку все данные помещаются в буферы, но как только вы заполните буферы, система заблокируется.
Вы должны мультиплексировать отправку / получение. например Вы можете запустить поток на клиенте, который делает
InputStream in = socket.getInputStream();
IOUtils.copy(in, System.out)
Таким образом, прием может осуществляться параллельно с отправкой данных клиентом
Или вы можете использовать 2 потока на стороне сервера. Один для получения данных, отправки данных для отправки в другой поток, выполняющий отправку (в этом случае вам придется создать внутреннюю очередь между потоками).