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");