Обмен данными по сети на основе сокетов в Java
Передача данных — одна из краеугольных задач информационных технологий. От неё зависит как работа компаний, так и повседневная жизнь обычных людей.
Для решения этой задачи Java предоставляет различные механизмы, среди которых особое место занимают сокеты.
Сокет (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения (Википедия).
Ключевое отличие сокетов от других сетевых инструментов Java (таких как HttpRequest, SMTPTransport и др.) состоит в том, что:
- Сокеты представляют собой достаточно низкоуровневый интерфейс.
Это позволяет работать напрямую через протокол TCP/IP и тем самым обеспечивает универсальность. - Сокеты позволяют обеспечить обмен данными в режиме достаточно приближенном к реальному времени.
При отсутствии задержек при обработке и передачи данных обмен происходит с очень высокой скоростью.
Недостаток сокетов, по сути является продолжением их достоинств. Универсальность и работа на низком уровне неизбежно порождает неудобство при работе с распространёнными протоколами (того же HTTP) . Поэтому для них лучше использовать высокоуровневые средства. Но, подобные протоколы, к сожалению, не покрывают весь спектр задач сетевого программирования. Поэтому программирование на сокетах по-прежнему остаётся актуальным.
Ниже мы рассмотрим примеры создания и работы серверных и клиентских сокетов на примере несложного клиент-серверного приложения.
Серверная часть
Существует два вида сокетов. Серверные и клиентские. В этой части мы рассмотрим серверные сокеты.
Серверные сокеты реализуются на основе класса ServerSocket. Они прослушивают определённый порт и по получении данных от клиента могут сформировать и передать ответ.
Ниже приведён пример создания серверного сокета для 5000 порта.