На этом шаге мы начнем рассматривать еще одно клиент-серверное приложение
Пусть у нас будет приложение, с помощью которого можно отправлять файлы на сервер. Клиентская часть сначала запросит логин. Далее будет спрашивать тип операции:
На каждый тип операции сервер будет выдавать ответ. Ниже приведем реализацию клиентской части.
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. Удаление файла
На следующем шаге мы продолжим изучение этого вопроса