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