Как правильно реализовать клиент-сервер приложение на 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();
        }
    }
}
  • Вопрос задан
  • 18449 просмотров
Решения вопроса 2
Ну если банальные ответы, которые сразу приходят на ум
1 2 ) Разбивать все на куски размером N байт(чтобы можно было считывать). При начале посылки файла отправляешь сколько кусков какого размера будет и этим можно реализовать докачку.
3) не очень понимаю в чем проблема. просто передаешь

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

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

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

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

Войти через центр авторизации
Похожие вопросы