Сокеты в Java и JSON
До сих пор наши программы работали в одиночку: читали файлы, писали в базы данных, рисовали окна. Но современные приложения почти всегда общаются по сети: браузер запрашивает страницу у сервера, мобильное приложение получает данные из облака, игра соединяется с другими игроками.
План лекции
Сегодня мы соединим две темы: сеть и формат данных.
- 1 Что такое сокет и зачем он нужен
- 2 TCP и UDP — два протокола передачи
- 3 Класс
Socket— клиент - 4 Класс
ServerSocket— сервер - 5 Как передаются данные: потоки ввода-вывода
- 6 Проблема: как передать сложный объект
- 7 JSON — текстовый формат данных
- 8 Библиотека Jackson
- 9 Сериализация: объект → JSON
- 10 Десериализация: JSON → объект
- 11 Собираем всё вместе
- 12 Типичные ошибки
Что такое сокет?
Сокет (от английского socket — «гнездо», «разъём») — это программный интерфейс, который позволяет двум программам обмениваться данными по сети.
Представьте себе телефонный разговор. Чтобы позвонить, вам нужен номер (IP-адрес) и добавочный (порт). Сокет — это «трубка», через которую вы говорите.
java.net. Это часть стандартной библиотеки, ничего дополнительно скачивать не нужно.TCP и UDP — два протокола
Сокеты работают поверх одного из двух протоколов передачи данных.
Transmission Control Protocol (протокол управления передачей). Надёжный, гарантирует доставку и порядок. Как телефонный разговор.
User Datagram Protocol (протокол пользовательских датаграмм). Быстрый, но без гарантий. Как почтовые открытки.
Класс Socket — клиент
Socket — это класс, который представляет клиентскую сторону соединения. Клиент подключается к серверу по IP-адресу и порту.
"localhost"— адрес сервера. Если сервер на другом компьютере, указывается его IP.8080— порт. Порт — это «дверь» на сервере, через которую принимаются подключения.- Если сервер недоступен, будет выброшено исключение
ConnectException.
Класс ServerSocket — сервер
ServerSocket — это класс, который представляет серверную сторону. Он «слушает» порт и ждёт, пока клиент подключится.
accept()блокирует программу, пока не придёт клиент.- Когда клиент подключился, возвращается новый
Socket— соединение именно с этим клиентом. - Сам
ServerSocketпродолжает слушать порт для следующих клиентов.
accept() ждёт вечно, если никто не подключается. В реальных серверах это нормально — сервер работает постоянно.Как передаются данные
После установки соединения данные передаются через потоки ввода-вывода сокета.
InputStream и OutputStream, которые мы использовали для файлов. Сокет — это просто «файл», который находится на другом компьютере.Проблема: как передать объект
Через сокет можно передавать байты. Но как передать объект Person(name, age)?
«Иван,25» — работает, но легко ошибиться: а если в имени есть запятая?
Структурированный формат, который понимают все языки.
JSON — основные правила
JSON состоит из пар «ключ: значение» и массивов.
Библиотека Jackson
Вручную собирать и разбирать JSON неудобно. Для этого есть библиотеки. Самая популярная в Java — Jackson.
Java-объект → JSON-строка
JSON-строка → Java-объект
Сериализация: объект → JSON
Превратить Java-объект в JSON-строку очень просто.
ObjectMapper— главный класс Jackson.writeValueAsString()— превращает объект в JSON.- Jackson сам обходит все поля объекта и создаёт JSON.
Десериализация: JSON → объект
Обратная операция — из JSON-строки получить Java-объект.
readValue()— принимает JSON-строку и класс, в который нужно превратить.- Jackson сам создаёт объект и заполняет поля.
- Для этого у класса должен быть конструктор без аргументов (или аннотации Jackson).
Собираем всё вместе: клиент и сервер
Вот как выглядит полная цепочка передачи объекта по сети.
Пример клиента
Полный код клиента, который подключается к серверу и отправляет JSON.
PrintWriter с параметром true автоматически сбрасывает буфер после каждой строки. Это удобно для сокетов.Пример сервера
Сервер принимает JSON, разбирает его и выводит данные.
Типичные ошибки
Сокеты — это ресурсы. Их нужно закрывать через
try-with-resources или close().Ошибка
BindException. Значит, кто-то уже слушает этот порт. Выберите другой.Клиент получит
ConnectException. Сначала запускайте сервер, потом клиента.Нужны геттеры и конструктор без аргументов. Или аннотации
@JsonProperty.При передаче русских символов используйте
PrintWriter и BufferedReader с указанием UTF-8.Если сервер на другом компьютере, клиент должен подключаться к его IP, а не к
localhost.Безопасность: SSL/TLS
Обычные сокеты передают данные открытым текстом. Любой, кто «слушает» сеть, может их прочитать.
Данные передаются как есть. Подходит для локальной сети и нечувствительных данных.
Данные шифруются. Нужно для паролей, личной информации, банковских данных.
SSLSocket — часть стандартной библиотеки Java (javax.net.ssl). Но для реальных приложений лучше использовать HTTP-клиенты, которые делают всё сами.Многопоточность на сервере
Наш сервер обрабатывает только одного клиента за раз. Что, если их десять?
- Основной поток продолжает слушать порт.
- Каждый клиент обслуживается в своём потоке.
- Клиенты не мешают друг другу.
oaip21.html).Шпаргалка
Сохраните этот слайд — здесь всё, что нужно для практики.
Итоги лекции
Подведём итоги. Вот что вы теперь знаете.
- ✅ Сокет — интерфейс для обмена данными между программами по сети.
- ✅ TCP — надёжный протокол с гарантией доставки.
- ✅ Socket — клиентская сторона соединения.
- ✅ ServerSocket — серверная сторона, слушает порт.
- ✅ Потоки — данные передаются через
InputStreamиOutputStream. - ✅ JSON — текстовый формат для передачи объектов.
- ✅ Jackson — библиотека для сериализации и десериализации JSON.
- ✅ Сериализация — объект → JSON.
- ✅ Десериализация — JSON → объект.
- ✅ try-with-resources — обязательное закрытие сокетов.
Домашнее задание
Задания для самостоятельной работы. Первые три обязательны, остальные — для оценки «отлично».
- Подключите Jackson к проекту через Maven.
- Создайте класс
Book(title, author, year)с геттерами и конструктором без аргументов. - Напишите программу, которая сериализует
Bookв JSON и выводит результат в консоль. - Напишите программу, которая десериализует JSON-строку обратно в
Book. - Запустите сервер и клиент из лекции. Убедитесь, что данные передаются.
- Доработайте сервер, чтобы он отвечал клиенту «Получено!».
Что дальше?
На практике мы соберём настоящее клиент-серверное приложение.
- Практика: создание клиент-серверного приложения «Список книг».
- Клиент отправляет книгу в JSON на сервер.
- Сервер принимает, сохраняет в список и отвечает подтверждением.
- Клиент запрашивает список всех книг.
- Сервер отправляет список в JSON.
Советы перед практикой
Несколько советов, которые сэкономят время.
Потом клиент. Иначе — ошибка подключения.
Java пишет, что именно не так и в какой строке.
Меняйте данные, добавляйте поля, ломайте и чините.
Каждая ошибка — подсказка.
Спасибо за внимание!
🔌
Сокеты — это мост между программами
Теперь вы умеете передавать данные по сети и упаковывать их в JSON. Это фундамент современных приложений.