1) для докачки вы должны после подключения к серверу отправлять ему информацию, к примеру, сколько у вас уже есть данных, что бы вы продолжили с нужного места в файле.
2) вы и не передаете по байтам. операционная система всеравно склеивает все данные в пакеты определенного размера. А вот считывать файлы нужно
кусками, а не сразу весь в память грузить, и отправлять кусочками в 1-4 килобайт. Операционная система всеравно сама определит оптиальный размер пакетов.
3) вам нужно разработать протокол для обмена данными. Скажем клиент отправляет команду get и следом путь к файлу. Так же можно придумывать варианты типа клиент посылает серверу запрос list и тот возвращает списов файлов. Для ваших задачь подойдут текстовые протколы (аля http)