WebSocket — это протокол связи, который обеспечивает полнодуплексную (двустороннюю) связь между клиентом и сервером через одно долгоживущее соединение. В отличие от HTTP, который является полудуплексным (запрос-ответ), WebSocket позволяет серверу и клиенту обмениваться данными в реальном времени без необходимости постоянного установления новых соединений.
WebSocket начинается с HTTP-запроса, который называется WebSocket Handshake. Клиент отправляет HTTP-запрос с заголовком Upgrade: websocket
, чтобы переключить соединение на WebSocket.
Пример запроса:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Если сервер поддерживает WebSocket, он отвечает:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
После этого соединение переключается на WebSocket.
После установления соединения клиент и сервер могут обмениваться данными в формате кадров (frames). Кадры могут быть текстовыми, бинарными или управляющими (например, для закрытия соединения).
Соединение закрывается с помощью специального управляющего кадра.
Spring предоставляет поддержку WebSocket через библиотеку Spring WebSocket.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); // Префикс для подписок
config.setApplicationDestinationPrefixes("/app"); // Префикс для сообщений
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS(); // Эндпоинт для WebSocket
}
}
@Controller
public class WebSocketController {
@MessageMapping("/chat.sendMessage")
@SendTo("/topic/public")
public ChatMessage sendMessage(ChatMessage message) {
return message; // Отправка сообщения всем подписчикам
}
}
public class ChatMessage {
private String content;
private String sender;
// Геттеры и сеттеры
}
const socket = new SockJS('/ws');
const stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
stompClient.subscribe('/topic/public', function (message) {
console.log("Received: " + message.body);
});
});
function sendMessage() {
const message = { content: "Hello", sender: "User" };
stompClient.send("/app/chat.sendMessage", {}, JSON.stringify(message));
}
WebSocket — это мощный протокол для двусторонней связи в реальном времени, который отличается от HTTP своей долгоживущей природой и низкими накладными расходами. Он идеально подходит для приложений, требующих мгновенного обмена данными, таких как чаты, уведомления и онлайн-игры. В Java реализация WebSocket может быть выполнена с использованием Spring WebSocket, что значительно упрощает процесс разработки.