Одностороннее закрытие сокета Java

Одностороннее закрытие сокета JavaОдностороннее закрытие(half-close) обеспечивает возможность одной стороне закрыть соединение с сокетом, прекратив отправку своих данных, но при этом получая данные с другой стороны.

Вот типичная ситуация. Предположим, что вы отправляете данные на сервер, но не знаете, какой объем данных необходимо передать. Если вы имеете дело с файлом, то, закрыв его, вы тем самым определяете конец данных. Закрыв же сокет, вы немедленно разорвете соединение с сервером.Данную проблему решает одностороннее закрытие. Если вы закроете выходной поток, связанный с сокетом, вы тем самым укажете серверу на окончание запроса. При этом входной поток останется открытым, и вы сможете прочитать ответ.

Программа на стороне клиента, реализующая данный подход, выглядит приблизительно так, как показано ниже.

Программа на стороне сервера лишь читает данные из входного потока до тех пор, пока не закроется выходной поток на другом конце соединения.

Очевидно, что данный подход применим только при работе с протоколами, подобными HTTP, где клиент устанавливает соединение с сервером, передает запрос, получает ответ, после чего соединение разрывается.