WebSocket в Java: библиотека Java-WebSocket для реального времени

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

WebSocket в Java: библиотека Java-WebSocket

В современной веб-разработке потребность в двусторонней связи в реальном времени становится всё более актуальной. Чат-приложения, онлайн-игры, биржевые котировки, уведомления — всё это требует мгновенной передачи данных между клиентом и сервером. Для Java одной из самых популярных и надёжных реализаций протокола WebSocket является библиотека Java-WebSocket (также известная как nv-websocket-client).

В этой статье мы подробно разберём, как использовать Java-WebSocket для создания серверных и клиентских приложений, приведём примеры кода и рассмотрим лучшие практики.

Что такое Java-WebSocket?

Java-WebSocket — это легковесная, мощная библиотека с открытым исходным кодом, реализующая протокол WebSocket (RFC 6455). Она позволяет разработчикам Java легко создавать как WebSocket-серверы, так и WebSocket-клиенты без необходимости погружаться в низкоуровневые детали протокола.

Основные возможности библиотеки:

  • Полная поддержка серверной и клиентской сторон WebSocket.
  • Поддержка WSS (WebSocket Secure) через SSL/TLS.
  • Автоматическое переподключение при разрыве соединения.
  • Обработка фрагментированных сообщений.
  • Поддержка пользовательских расширений.
  • Простой API на основе событий (onOpen, onMessage, onClose, onError).

Установка и подключение

Для использования библиотеки добавьте зависимость в ваш pom.xml (Maven):

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.4</version>
</dependency>

Если вы используете Gradle:

implementation 'org.java-websocket:Java-WebSocket:1.5.4'

Создание WebSocket сервера

Рассмотрим простой пример WebSocket-сервера, который принимает сообщения и отправляет их обратно всем подключённым клиентам (эхо-сервер):

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import java.net.InetSocketAddress;
import java.util.Set;

public class EchoServer extends WebSocketServer {

    public EchoServer(int port) {
        super(new InetSocketAddress(port));
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        System.out.println("Новое подключение: " + conn.getRemoteSocketAddress());
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        System.out.println("Отключение: " + conn.getRemoteSocketAddress() + " (" + reason + ")");
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        System.out.println("Получено сообщение: " + message);
        // Отправляем сообщение обратно всем клиентам
        Set<WebSocket> connections = getConnections();
        for (WebSocket client : connections) {
            client.send("Эхо: " + message);
        }
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        System.err.println("Ошибка: " + ex.getMessage());
        if (conn != null) {
            conn.close();
        }
    }

    @Override
    public void onStart() {
        System.out.println("Сервер запущен на порту " + getPort());
    }

    public static void main(String[] args) {
        int port = 8887;
        EchoServer server = new EchoServer(port);
        server.start();
    }
}

Этот сервер запускается на порту 8887 и при получении любого сообщения отправляет его обратно всем подключённым клиентам с префиксом "Эхо:".

Создание WebSocket клиента

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

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;

public class SimpleClient extends WebSocketClient {

    public SimpleClient(URI serverUri) {
        super(serverUri);
    }

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        System.out.println("Подключено к серверу");
        // Отправляем приветственное сообщение
        send("Привет, сервер!");
    }

    @Override
    public void onMessage(String message) {
        System.out.println("Получено от сервера: " + message);
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("Соединение закрыто: " + reason);
    }

    @Override
    public void onError(Exception ex) {
        System.err.println("Ошибка клиента: " + ex.getMessage());
    }

    public static void main(String[] args) throws URISyntaxException {
        URI serverUri = new URI("ws://localhost:8887");                    

Рекомендаций