У меня была такая же проблема с файлами около 300К. Проблема в том, что отправителю необходимо знать, когда получатель опустошил канал, перед отправкой следующего фрагмента.
Я закончил с простым государственным двигателем, который работал с обеих сторон. Отправитель передает заголовок с количеством отправленных байтов и размером пакета, затем ожидает подтверждения от другой стороны. Как только он получает рукопожатие, он переходит к отправке пакетов фиксированного размера, каждый из которых имеет порядковый номер.
Получатель получает каждый, читает его и добавляет его в буфер, а затем записывает обратно в канал, что он получил пакет с последовательностью #. Отправитель читает пакет #, вырезает значение другого буфера и так далее, и так далее. Каждая сторона отслеживает состояние, в котором она находится (в режиме ожидания, отправляющий заголовок, принимающий заголовок, отправка данных, получение данных, ошибка, выполнено и т. Д.) Обе стороны должны отслеживать, когда читать / записывать последний фрагмент, поскольку вероятно, будет меньше, чем полный размер буфера.
Это работает нормально (хотя и немного медленно) и может масштабироваться до любого размера. Я начал с размера пакетов 5K, но он работал довольно медленно. Повысил его до 10K, но он начал вызывать проблемы, поэтому я отступил и удержал его на уровне 8096. Он отлично работает как для двоичных, так и для текстовых данных.