Шаг 159.
Язык программирования Java.
Второе клиент-серверное приложение. Клиентская часть

На этом шаге мы начнем рассматривать еще одно клиент-серверное приложение

Пусть у нас будет приложение, с помощью которого можно отправлять файлы на сервер. Клиентская часть сначала запросит логин. Далее будет спрашивать тип операции:

  1. Получить список файлов.
  2. Удалить файл на сервере.
  3. Отправить файл на сервер.
  4. Выход из приложения.

На каждый тип операции сервер будет выдавать ответ. Ниже приведем реализацию клиентской части.

import java.io.*;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Client {

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(
                                                   new InputStreamReader(System.in));

        System.out.print("Введите логин пользователя: ");
        String loginValue = bufferedReader.readLine();

        try (Socket socket = new Socket(Constants.HOST, Constants.PORT)) {
      DataInputStream inputStream = new DataInputStream(socket.getInputStream());
      DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

            login(loginValue, outputStream);

            while (true) {
                printMenu();
                int number = Integer.valueOf(bufferedReader.readLine());

                System.out.println("--------------------------------------------");
                if (number == 1) {
                    getFilesList(inputStream, outputStream);
                } else if (number == 2) {
                    System.out.print("Введите имя файла: ");
                    String fileName = bufferedReader.readLine();
                    deleteFile(fileName, inputStream, outputStream);
                } else if (number == 3) {
                    System.out.print("Введите имя файла: ");
                    String fileName = bufferedReader.readLine();

                    File file = Paths.get(fileName).toFile();
                    if (!file.exists()) {
                        System.out.println("Введите имя существующего файла");
                    } else if (!file.isFile()) {
                        System.out.println("Введите имя файла");
                    } else {
                        sendFile(fileName, inputStream, outputStream);
                    }

                } else if (number == 4) {
                    break;
                }
            }

            logout(outputStream);

            inputStream.close();
            outputStream.close();
        }
    }

    /**
     * Выводит меню
     */
    private static void printMenu() {
        System.out.println("--------------------------------------------");
        System.out.println("1) Список файлов в облаке");
        System.out.println("2) Удалить файл");
        System.out.println("3) Отправить файл");
        System.out.println("4) Выход");
        System.out.print("Введите номер пункта: ");
    }

    /**
     * Регистрирует заданного пользователя
     *
     * @param loginValue   заданный логин
     * @param outputStream Выходной поток
     */
    private static void login(String loginValue,
                              DataOutputStream outputStream) throws IOException {
        outputStream.writeUTF(TypeOperation.LOGIN.name());
        outputStream.writeUTF(loginValue);
        outputStream.flush();
    }

    /**
     * Производит выход из системы
     *
     * @param outputStream Выходной поток
     */
    private static void logout(DataOutputStream outputStream) throws IOException {
        outputStream.writeUTF(TypeOperation.LOGOUT.name());
        outputStream.flush();
    }

    /**
     * Получает список файлов пользователя
     *
     * @param inputStream  Входной поток
     * @param outputStream Выходной поток
     */
    private static void getFilesList(DataInputStream inputStream,
                                 DataOutputStream outputStream) throws IOException {
        outputStream.writeUTF(TypeOperation.FILES_LIST.name());
        outputStream.flush();

        int countFiles = inputStream.readInt();
        if (countFiles == 0) {
            System.out.println("У вас нет файлов в облаке");
            return;
        }

        System.out.println("Список файлов:");
        for (int i = 0; i < countFiles; i++) {
            String fileName = inputStream.readUTF();
            System.out.println("\t" + fileName);
        }
    }

    /**
     * Удаляет заданный файл
     *
     * @param fileName     Имя файла
     * @param inputStream  Входной поток
     * @param outputStream Выходной поток
     */
    private static void deleteFile(String fileName,
                                   DataInputStream inputStream,
                                   DataOutputStream outputStream) throws IOException {
        System.out.print("Удаление файла.... ");

        outputStream.writeUTF(TypeOperation.DELETE_FILE.name());
        outputStream.writeUTF(fileName);
        outputStream.flush();

        String response = inputStream.readUTF();
        System.out.println(response);
    }

    /**
     * Отправляет заданный файл
     *
     * @param fileName     Имя файла
     * @param inputStream  Входной поток
     * @param outputStream Выходной поток
     */
    private static void sendFile(String fileName,
                                 DataInputStream inputStream,
                                 DataOutputStream outputStream) throws IOException {
        System.out.print("Отправка файла.... ");

        outputStream.writeUTF(TypeOperation.SEND_FILE.name());
        outputStream.writeUTF(fileName);
        outputStream.flush();

        long fileSize = Files.size(Paths.get(fileName));
        outputStream.writeLong(fileSize);
        outputStream.flush();

        Files.copy(Paths.get(fileName), outputStream);
        outputStream.flush();

        String response = inputStream.readUTF();
        System.out.println(response);
    }
}

Проект можно взять здесь


Рис. 1. Ввод логина


Рис. 2. Вывод списка файлов


Рис. 3. Отправка файла


Рис. 4. Удаление файла

На следующем шаге мы продолжим изучение этого вопроса

Предыдущий шаг Содержание Следующий шаг