Практика: клиент-серверное приложение «Список книг»
Мы изучили сокеты и JSON. Теперь соберём настоящее клиент-серверное приложение: клиент отправляет книги на сервер, сервер их хранит и отдаёт обратно по запросу. Всё общение — по сети через сокеты, в формате JSON.
Book (модель книги), BookServer (сервер), BookClient (клиент) и Main (точка входа). Клиент и сервер будут общаться JSON-сообщениями.
Цель и задачи
Цель: получить практические навыки работы с сокетами и JSON в Java.
Что мы сделаем
- 1 Настроим Maven-проект и подключим Jackson.
- 2 Создадим класс
Bookс полями title, author, year. - 3 Напишем сервер, который принимает JSON и хранит книги в списке.
- 4 Напишем клиент с меню: добавить книгу, показать все, выйти.
- 5 Проверим, что данные передаются по сети.
Схема приложения
Вот как устроено наше приложение.
Шаг 1: создаём Maven-проект
Создадим проект с Maven (система сборки Java, которая сама скачивает библиотеки).
В pom.xml добавим зависимость Jackson:
pom.xml нужно нажать «Load Maven Changes».Шаг 2: класс Book
Класс книги с тремя полями. Он должен иметь конструктор без аргументов и геттеры/сеттеры — это требование Jackson.
Шаг 3: сервер — начало
Сервер слушает порт 8080 и хранит книги в списке.
Шаг 3: сервер — обработка клиента
Метод handleClient читает команды клиента и отвечает.
readLine / println.Шаг 4: клиент — меню
Клиент подключается к серверу и показывает меню.
Шаг 4: клиент — добавление и список
Обработка пунктов «Добавить книгу» и «Показать все».
Book[] через mapper.readValue.Шаг 5: точка входа
Класс Main спрашивает, кем запустить программу — сервером или клиентом.
Проверка работы
Как проверить, что всё работает.
Шаг 1. Запустить сервер
В одном терминале (или в одной вкладке IDE) запустите Main и выберите «1». Увидите:
Шаг 2. Запустить клиент
Во втором терминале запустите Main снова и выберите «2».
Шаг 3. Добавить книгу
В меню клиента выберите «1», введите название, автора, год. Увидите:
Шаг 4. Показать список
Выберите «2». Сервер вернёт JSON-массив, клиент выведет книги:
Типичные ошибки
Ошибка
BindException: Address already in use. Значит, сервер уже запущен или порт занят другой программой. Смените порт или закройте лишние процессы.Ошибка
ConnectException. Клиент не может подключиться. Запустите сервер первым.Проверьте, что у
Book есть конструктор без аргументов и геттеры/сеттеры для всех полей.Вероятно, сервер не отправил ответ. Проверьте, что сервер вызывает
out.println после каждой команды.Возникает при передаче через сокеты. Решение: использовать
PrintWriter с UTF-8 и убедиться, что кодировка консоли правильная.Забыли
socket.close() или try-with-resources. Соединение остаётся открытым и «висит».Задание для расширения
После того как базовое приложение работает, попробуйте его улучшить.
Задание 1. Добавить удаление книги
Добавьте команду DELETE title, которая удаляет книгу по названию. Клиент должен отправлять название, а сервер — удалять книгу из списка.
Задание 2. Поиск по автору
Добавьте команду FIND author, которая возвращает JSON-массив только тех книг, у которых автор совпадает.
Задание 3. Сохранить в файл
При добавлении книги сервер должен дописывать её в файл books.json через Files.writeString.
Задание 4. Несколько клиентов
Сейчас сервер обрабатывает одного клиента за раз. Сделайте так, чтобы каждый клиент обрабатывался в отдельном потоке.
Дополнительные идеи
Если хотите развивать проект дальше — вот идеи.
Шифрование соединения через TLS. Нужно для настоящих паролей.
Каждый клиент обслуживается в своём потоке. Не блокирует других.
Вместо
List использовать JDBC и хранить книги в MS SQL Server.Заменить сокеты на HTTP-сервер через Spring Boot.
Шпаргалка
Сохраните этот слайд — всё, что нужно для практики.
Итоги практики
Подведём итоги.
- ✅ Настроили Maven-проект и подключили Jackson.
- ✅ Создали класс Book с конструктором без аргументов и геттерами.
- ✅ Написали сервер на
ServerSocket, который принимает команды. - ✅ Написали клиент с меню и подключением к серверу.
- ✅ Научились передавать объекты через сокеты в формате JSON.
- ✅ Разобрали команды ADD, LIST, EXIT.
- ✅ Поняли, как работает сериализация и десериализация.
- ✅ Разобрали типичные ошибки и способы их исправления.
Домашнее задание
Задания для самостоятельной работы.
- Повторите практику с нуля — создайте Maven-проект, все четыре класса, запустите сервер и клиент.
- Добавьте команду
DELETE title— удаление книги по названию. - Добавьте команду
FIND author— поиск книг по автору. - Добавьте сохранение книг в файл
books.json. - Сделайте так, чтобы сервер обрабатывал несколько клиентов в отдельных потоках.
- Добавьте команду
COUNT, которая возвращает количество книг на сервере.
Как проверить, что всё сделано правильно
Чек-лист для самопроверки.
Без ошибок.
Ошибок «Class not found» нет.
Выводит сообщение о порте.
Меню отображается.
Сервер отвечает «OK».
Книги видны в консоли клиента.
Безопасность в реальных проектах
Наше приложение — учебное. В реальных проектах нужно учитывать безопасность.
- SSL/TLS. Используйте
SSLSocketвместоSocketдля шифрования данных. - Аутентификация. Клиент должен подтвердить, что он имеет право на запросы.
- Валидация. Проверяйте данные, которые приходят от клиента (не пустые, корректного типа).
- Ограничение размера. Ограничивайте размер входящих сообщений, чтобы избежать атак.
- Логирование. Записывайте все запросы для аудита.
- Таймауты. Устанавливайте таймаут соединения, чтобы не «висеть» вечно.
Что дальше?
Мы закончили блок «Сокеты + JSON». Куда двигаться?
- JavaFX — современная замена Swing для красивых приложений.
- HTTP и REST API — как работают сайты и веб-сервисы.
- Spring Boot — фреймворк для серверной разработки на Java.
- Базы данных в сети — JDBC + удалённый сервер.
- Многопоточность и сокеты — обслуживание нескольких клиентов.
Советы для дальнейшей работы
Несколько советов, которые пригодятся в будущем.
Java подробно описывает проблемы. Читайте сообщение полностью.
JUnit — стандарт тестирования. Мы разбирали его в oaip23.
Каждый проект — это опыт. Не бойтесь экспериментировать.
Программирование — это командная работа. Обсуждайте задачи.
Итоговый чек-лист
Что вы должны уметь после этой практики.
- ✅ Создавать Maven-проект и подключать Jackson.
- ✅ Писать класс модели с конструктором без аргументов.
- ✅ Запускать сервер на
ServerSocketи принимать клиентов. - ✅ Подключаться клиентом через
Socket. - ✅ Обмениваться сообщениями через
PrintWriter/BufferedReader. - ✅ Превращать объект в JSON и обратно.
- ✅ Работать с JSON-массивом.
- ✅ Обрабатывать ошибки подключения.
Резюме
Короткое резюме практики.
- Сервер — слушает порт, принимает клиентов, обрабатывает команды.
- Клиент — подключается к серверу, отправляет команды, выводит ответы.
- Book — модель данных с сериализацией Jackson.
- JSON — формат обмена, читаемый и удобный для парсинга.
- Socket / ServerSocket — основа сетевого общения в Java.
Что было самым сложным?
Подумайте и ответьте себе:
- Что было непонятно в самом начале?
- Что стало понятно после практики?
- Какая часть больше всего понравилась?
- Что хотите изучить глубже?
Проверка результата
- Maven-проект с четырьмя классами: Book, BookServer, BookClient, Main.
- При запуске Main выбор «1» — сервер запускается на порту 8080.
- При выборе «2» — клиент подключается к серверу.
- Команда «1» в меню клиента — добавление книги.
- Команда «2» — вывод всех книг.
- Команда «0» — выход и закрытие соединения.
- Все данные передаются в формате JSON.
Спасибо за работу!
📚
Клиент-серверное приложение «Список книг» готово!
Вы научились работать с сокетами, JSON и библиотекой Jackson. Это фундамент сетевого программирования на Java.