Ну если банальные ответы, которые сразу приходят на ум
1 2 ) Разбивать все на куски размером N байт(чтобы можно было считывать). При начале посылки файла отправляешь сколько кусков какого размера будет и этим можно реализовать докачку.
3) не очень понимаю в чем проблема. просто передаешь
P.S. Для понимания клиент-сокетов на Java для начала почитайте
link