Загрузка изображений на основе протокола TCP

JavaBeginner
Практиковаться сейчас

Введение

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

👀 Предварительный просмотр

Интерфейс загрузки изображения клиентом

Интерфейс загрузки изображения клиентом

Передача изображения между клиентом и сервером

🎯 Задачи

В этом проекте вы научитесь:

  • настраивать сервер для прослушивания входящих соединений от клиентов и приема загруженных изображений;
  • реализовывать клиента для чтения локального файла изображения и отправки его на сервер;
  • обрабатывать взаимодействие между клиентом и сервером с использованием TCP-сокетов;
  • предоставлять обратную связь клиенту при успешной загрузке изображения.

🏆 Достижения

После завершения этого проекта вы сможете:

  • создавать архитектуру клиент-сервер с использованием Java;
  • использовать TCP-сокеты для передачи файлов между клиентом и сервером;
  • обрабатывать операции ввода-вывода файлов в Java;
  • реализовывать базовые механизмы обработки ошибок и обратной связи.

Настройка сервера

В этом шаге вы научитесь настраивать сервер для приема загруженного изображения.

  1. Откройте файл org/labex/service/UploadService.java в вашем редакторе кода.

  2. В методе main() создайте объект ServerSocket для прослушивания входящих соединений от клиентов на порту 10203:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
        try (ServerSocket server = new ServerSocket(10203)) {
            // Будет непрерывно принимать соединения от клиентов
            while (true) {
                // Сервер ожидает
                // Возвращает Socket клиента, если есть соединение
                Socket client = server.accept();
                InetAddress clientAddress = client.getInetAddress();
                // Принимает загруженное изображение от клиента
                // Входной поток: читает поток изображения, отправленный клиентом
                // Выходной поток: записывает в локальное изображение
                String name = "/home/labex/project/pic/mn.jpg";

                try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name));
                     InputStream in = client.getInputStream();
                     BufferedInputStream bis = new BufferedInputStream(in);) {

                    // Считывает поток изображения из клиента
                    // Записывает в локальный файл
                    byte[] buffer = new byte[1024];
                    int length = -1;
                    while ((length = bis.read(buffer))!= -1) {
                        bos.write(buffer, 0, length);
                    }

                    // Отправляет сообщение клиенту
                    try (BufferedWriter writer = new BufferedWriter(
                            new OutputStreamWriter(client.getOutputStream()))) {
                        writer.write("Reception Complete");
                        writer.newLine();
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
  1. Сервер будет непрерывно принимать соединения от клиентов и получать загруженное изображение. Полученное изображение будет сохранено в файле /home/labex/project/pic/mn.jpg.

  2. После получения изображения сервер отправит клиенту сообщение "Reception Complete".

Реализация клиента

В этом шаге вы научитесь реализовать клиента для загрузки изображения на сервер.

  1. Откройте файл org/labex/client/UploadClient.java в вашем редакторе кода.

  2. В методе main() создайте объект Socket для подключения к серверу по адресу 127.0.0.1:10203:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
        try (
            // Socket: Компонент для общения клиента
            // Чтение локального изображения => Отправка на сервер через выходной поток
            // OutputStream: Отправляет поток локального файла изображения на сервер
            // BufferedInputStream: Читает локальное изображение
            Socket client = new Socket("127.0.0.1", 10203);
            OutputStream out = client.getOutputStream();
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(
                    "/home/labex/project/timg.jpg"))
        ) {
            // Читает по 1024 байта за раз
            byte[] buffer = new byte[1024];
            int length = -1;
            while ((length = in.read(buffer))!= -1) {
                // Отправляет прочитанные данные на сервер через выходной поток
                out.write(buffer, 0, length);
            }
            // Временно завершает "вывод" (Socket не закрывается)
            client.shutdownOutput();

            // Читает обратную связь от сервера
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()))) {
                String reply = reader.readLine();
                System.out.println(reply);
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
  1. Клиент будет читать локальный файл изображения /home/labex/project/timg.jpg и отправлять его на сервер с использованием выходного потока сокета.

  2. После отправки изображения клиент будет читать сообщение с обратной связью от сервера и выводить его в консоль.

  3. Если сервер отправляет сообщение "Reception Complete", это означает, что загрузка изображения прошла успешно.

Теперь вы завершили реализацию как сервера, так и клиента. Вы можете скомпилировать и запустить программы, чтобы протестировать функциональность загрузки изображений.

Запуск

Откройте терминал и выполните следующую команду, чтобы скомпилировать программы клиента и сервера:

javac org/labex/client/UploadClient.java
javac org/labex/service/UploadService.java

Запустите сервер для прослушивания клиента:

java org.labex.service.UploadService

Откройте другой терминал, чтобы запустить клиента для загрузки изображения, и вы получите подсказку: "Reception Complete"

Подсказка при загрузке клиентом

java org.labex.client.UploadClient

Проверьте, содержит ли папка pic изображение или нет:

ls pic

Результат работы выглядит так:

Подсказка об успешной загрузке изображения

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться