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



🎯 Задачи
В этом проекте вы научитесь:
- настраивать сервер для прослушивания входящих соединений от клиентов и приема загруженных изображений;
- реализовывать клиента для чтения локального файла изображения и отправки его на сервер;
- обрабатывать взаимодействие между клиентом и сервером с использованием TCP-сокетов;
- предоставлять обратную связь клиенту при успешной загрузке изображения.
🏆 Достижения
После завершения этого проекта вы сможете:
- создавать архитектуру клиент-сервер с использованием Java;
- использовать TCP-сокеты для передачи файлов между клиентом и сервером;
- обрабатывать операции ввода-вывода файлов в Java;
- реализовывать базовые механизмы обработки ошибок и обратной связи.
Настройка сервера
В этом шаге вы научитесь настраивать сервер для приема загруженного изображения.
Откройте файл
org/labex/service/UploadService.javaв вашем редакторе кода.В методе
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();
}
Сервер будет непрерывно принимать соединения от клиентов и получать загруженное изображение. Полученное изображение будет сохранено в файле
/home/labex/project/pic/mn.jpg.После получения изображения сервер отправит клиенту сообщение "Reception Complete".
Реализация клиента
В этом шаге вы научитесь реализовать клиента для загрузки изображения на сервер.
Откройте файл
org/labex/client/UploadClient.javaв вашем редакторе кода.В методе
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();
}
Клиент будет читать локальный файл изображения
/home/labex/project/timg.jpgи отправлять его на сервер с использованием выходного потока сокета.После отправки изображения клиент будет читать сообщение с обратной связью от сервера и выводить его в консоль.
Если сервер отправляет сообщение "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, чтобы улучшить свои навыки.



