Многопоточное клиент-серверное приложение для обмена файлами

Вступление

Для того, чтобы иметь возможность передавать файлы между клиентом и сервером, существует протокол TCP/IP.

TCP – протокол управления передачей. Он служит для обеспечения и установление надежного соединения между двумя устройствами и надежную передачу данных. При этом протокол TCP контролирует оптимальный размер передаваемого пакета данных, осуществляя новую посылку при сбое передачи.

IP – интернет протокол или адресный протокол – основа всей архитектуры передачи данных. Протокол IP служит для доставки сетевого пакета данных по нужному адресу. При этом информация разбивается на пакеты, которые независимо передвигаются по сети до нужного адресата.

Постановка задачи

Задачей проекта является разработка клиент-серверного приложения для обмена файлами на языке программирования Java.

Цели и функции приложения:

  • Многопоточный сервер
  • Удобный и понятный интерфейс клиента
  • Работа с базой данных MySQL
  • Создание приватных комнат для обмена файлами
  • Информационное окно с логированием действий приложения
  • Поддержка архивации выбранным клиентом файлов
  • Поддержка передачи и приёма архивов с файлами

Описание архитектуры приложения

На рисунке 1 представлена схема работы, которая показывает, как работает наша программа на стороне сервера и клиента.

рисунок 1

Для гибкости разработки программы будем взаимодействовать с объектно-ориентированным программированием. На рисунке 2 представлена UML диаграмма классов на стороне сервера.

рисунок 2

На рисунке 3 представлена UML диаграмма классов на стороне клиента.

рисунок 3

Пример исходного кода

/**
     * Метод отсылает данные клиенту в новом потоке
     * Метод Находит данные в своей папке(dirServer)
     * Если они совпадают с теми, что хочет скачать
     *  пользователь, то отсылаем, иначе
     *  таких файлов нет или ошибка
     * @param _nameFileFromClient
     * @throws java.lang.InterruptedException
     */
    public void sendFilesToClient(String _nameFileFromClient) throws InterruptedException {
        // создаем новый поток
        // чтобы иметь возможность, использовать его ниже в run()
        Socket sockClient = this.sock;
            Thread threadSendFileToClient = new Thread(() -> {
            // был ли найден файл
            boolean find_file = false;
            try {
                // получаем все файлы из папки сервера(dirServer)
                File dir = new File(dirServer + System.getProperty("file.separator"));
                File[] files = dir.listFiles();
                for (File fileName : files) {
                    if (fileName.getName().equals(_nameFileFromClient)) {
                        try (FileInputStream fis = new FileInputStream(dirServer + System.getProperty("file.separator") + _nameFileFromClient)) {
                            byte[] buffer = new byte[8192];
                            dos.writeUTF(fileName.getName());
                            dos.writeLong(fileName.length());
                            int read; // читаем файл кусками и передаем
                            while ((read = fis.read(buffer)) > 0) {
                                dos.write(buffer, 0, read);
                            }
                            find_file = true;
                        }
                        dos.flush();
                        break;
                    }
                }
                if (!find_file) {
                    pw.println("Не было найдено на сервере...");
                    pw.println(_nameFileFromClient);
                } else {
                    pw.println("Успех");
                    pw.println(_nameFileFromClient);
                }
            } catch (Exception e) {
                pw.println("Ошибка передачи данных с сервера на клиент...");
                System.out.println(sockClient.getInetAddress() + ": Ошибка "
                        + "-ПЕРЕДАЧА ДАННЫХ КЛИЕНТУ-");
                pw.println(_nameFileFromClient);
            }
        });
        threadSendFileToClient.start();
        threadSendFileToClient.join(); // ждем выполнения потока threadSendFileToClient
    }

Руководство пользователя

Поскольку наше приложение по архитектуре клиент-сервер, то в первую очередь нам нужно запустить сервер, который в свою очередь открывает локальное соединение и работает на порту 8030. На рисунке 4 приведена форма сервера.

рисунок 4

Рассмотрим сторону клиента, главная форма клиентского приложения представлена на рисунке 5.

рисунок 5

Содержание архива

  • Исходный код клиентского приложения
  • Исходный код серверного приложения
Купить 2500,00 
(без учета комиссии 3,8 %)
Сразу после оплаты Вы получите работу на электронную почту. Файлы отправляются автоматически.
Купить

2500,00 

(без учета комиссии 3,8 %)

Сразу после оплаты Вы получите работу на электронную почту. Файлы отправляются автоматически.
file-transfer.zip
7432383
Оцени работу

рейтинг

Поделись работой с друзьями

Комментарии (0)

Alekseev

/ /

Оставить комментарий

Ты не можешь комментировать

Только зарегестрированые пользователи имеют возможность комментировать работы
Многопоточное клиент-серверное приложение для обмена файлами
Целью проекта является разработка клиент-серверного приложения для обмена файлами. Из цели проекта видно, что нам нужно создать два приложения, первым из которых, будет сервер, а вторым клиент. Задачей сервера будет прием и обработка информации от клиентов. Так как клиентов может быть много, сервер будет многопоточным. Задачей клиентского приложения будет передача файлов на сервер и загрузка с сервера нужных файлов от другого клиента или клиентов. Для того, чтобы наше клиентское приложение могло одновременно передавать и скачивать файлы сервера нужно реализовать два потока.
Категория: Образование
Стоимость: 2500,00