Как правильно реализовать клиент-сервер приложение на Java?

Делаю клиент - сервер приложение на Java. Есть пару вопросов:

1) Как сделать докачку? Например кусок файла передалось, а кусок нет, и при следующем запуске этот кусок докачался.
2) Как сделать чтобы передавалось не по байтам, а "кусками" ? Потому что по байтам большие файлы не передашь.
3) Как сделать чтобы с клавиатуры считался пусть к файлы и передавался на сервер? - Это очень очевидно, но после 7 часов не отходя от компа, голова не варит. Что тут нужно сделать? Считаем в переменную, а дальше? Как передать и как принять?

Клиент:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] argv) throws Exception {
        Socket sock = new Socket("127.0.0.1", 4444);
        byte[] mybytearray = new byte[1024];
        InputStream is = sock.getInputStream();
        FileOutputStream fos = new FileOutputStream("D:/client/file.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int bytesRead = is.read(mybytearray, 0, mybytearray.length);
        bos.write(mybytearray, 0, bytesRead);
        bos.close();
        sock.close();
    }
}


Сервер:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket servsock = new ServerSocket(4444);
        File myFile = new File("D:/server/file.txt");
        while (true) {
            Socket sock = servsock.accept();
            byte[] mybytearray = new byte[(int) myFile.length()];
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = sock.getOutputStream();
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            sock.close();
        }
    }
}
  • Вопрос задан
  • 18451 просмотр
Решения вопроса 2
Ну если банальные ответы, которые сразу приходят на ум
1 2 ) Разбивать все на куски размером N байт(чтобы можно было считывать). При начале посылки файла отправляешь сколько кусков какого размера будет и этим можно реализовать докачку.
3) не очень понимаю в чем проблема. просто передаешь

P.S. Для понимания клиент-сокетов на Java для начала почитайте link
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) для докачки вы должны после подключения к серверу отправлять ему информацию, к примеру, сколько у вас уже есть данных, что бы вы продолжили с нужного места в файле.

2) вы и не передаете по байтам. операционная система всеравно склеивает все данные в пакеты определенного размера. А вот считывать файлы нужно кусками, а не сразу весь в память грузить, и отправлять кусочками в 1-4 килобайт. Операционная система всеравно сама определит оптиальный размер пакетов.

3) вам нужно разработать протокол для обмена данными. Скажем клиент отправляет команду get и следом путь к файлу. Так же можно придумывать варианты типа клиент посылает серверу запрос list и тот возвращает списов файлов. Для ваших задачь подойдут текстовые протколы (аля http)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы