Нет необходимости беспокоиться о том, когда закрывать сокет на стороне вашего клиента. Пока данные записаны в сокет, вы можете закрыть их в любое время после этого. @cnicutar хорошо объясняет это в своем ответе.
Что касается специальных символов подтверждения от вашего сервера обратно к клиенту, вам не нужно беспокоиться об этом с TCP. Тем не менее, вы можете изменить свой блок данных так, чтобы он включал заголовок, указывающий, сколько данных есть. Например, первые 4 байта блока данных могут быть полем длины, указывающим, сколько еще байтов существует. Сервер может прочитать первые 4 байта, а затем узнать, сколько еще байтов нужно прочитать. TCP-коммуникации обычно имеют что-то вроде этого.