Автор: ТОМАС КЕНДАЛЛ
Перепечатано с общедоступного номера: stackgc
При разработке веб-приложений нам иногда нужно передавать события на стороне сервера подключенным клиентам. Но HTTP не может этого сделать: клиент открывает соединение с сервером и запрашивает данные, а иначе сервер не может этого сделать.
Чтобы обойти это ограничение, мы можем установить режим опроса, при котором веб-страница периодически опрашивает сервер на наличие новых событий. Но этот режим далеко не идеален, потому что он добавляет накладные расходы HTTP, скорость также зависит от частоты опроса и создает ненужную нагрузку на сервер.
К счастью, появился HTML5 WebSocket. Протокол WebSocket обеспечивает малозатратное взаимодействие между браузерами и веб-серверами. В этой статье мы представим API веб-сокетов и объясним, как реализовать веб-сокеты с помощью Spring Boot.
HTML5 спешит на помощь!
WebSocket обеспечивает полнодуплексную связь через одно соединение между браузером и сервером. Он не имеет накладных расходов HTTP и позволяет серверу отправлять сообщения клиенту в режиме реального времени.
API WebSocket на самом деле довольно прост. вам просто нужно создатьWebSocket
объекта, присоединяйте прослушиватели событий и отправляйте сообщения.
Вот пример:
var socket = new WebSocket('ws://' + window.location.host + '/my-websocket-endpoint');
// 链接打开的监听事件
socket.onopen = function() {
console.log('WebSocket connection opened. Ready to send messages.');
// 发送一条消息到服务端
socket.send('Hello, from WebSocket client!');
};
// 接受到服务端消息的监听器
socket.onmessage = function(message) {
console.log('Message received from server: ' + message);
};
Spring Boot
Spring обеспечивает хорошую поддержку интерфейса WebSocket.
Во-первых, нам нужно создать класс, который наследует класс Spring.TextWebSocketHandler
Добрый.
public class MyMessageHandler extends TextWebSocketHandler {
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
// WebSocket 被关闭后触发
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 新 WebSocket 建立连接触发
// 可以保存 session 对象来发送消息
// 发送第一条消息
session.sendMessage(new TextMessage("You are now connected to the server. This is the first message."));
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {
// 收到消息触发
System.out.println("Message received: " + textMessage.getPayload());
}
}
Далее нам нужно настроить конечную точку WebSocket.
@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {
@Bean
public WebSocketHandler myMessageHandler() {
return new MyMessageHandler();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myMessageHandler(), "/my-websocket-endpoint");
}
}
Поскольку WebSockets API — это чистый JavaScript, вы можете использовать его в большинстве интерфейсных фреймворков. Включая Angular, вы можете включать код JavaScript в TypeScript.
Суммировать
Это довольно просто? Это решает большую проблему с передачей данных между сервером и клиентом. Spring Boot делает это еще проще.