При записи в сетевой сокет и отправке данных накладываются определенные накладные расходы. Если бы данные отправлялись каждый раз, когда в сокет поступал байт, вы бы получили 40+ байтов заголовка TCP на каждый байт фактических данных. (Конечно, если вы используете сокет TCP. Другие сокеты будут иметь разные значения). Чтобы избежать такой неэффективности, сокет поддерживает локальный буфер, который обычно составляет более 1000 байтов. Когда этот буфер заполнен, заголовок оборачивается вокруг данных, и пакет отправляется по назначению.
Во многих случаях вам не нужно отправлять каждый пакет немедленно; если вы передаете файл, ранние данные могут быть бесполезны без конечных данных файла, так что это работает хорошо. Однако если вам необходимо принудительно отправить данные немедленно, очистка буфера отправит все данные, которые еще не были отправлены.
Обратите внимание, что когда вы закрываете сокет, он автоматически сбрасывает все оставшиеся данные, поэтому нет необходимости сбрасывать данные перед закрытием.