Связь в реальном времени: реализация веб-сокетов с Spring Boot

Spring Boot Java Spring WebSocket

keyholesoftware.com/2017/04/10/…

Автор: ТОМАС КЕНДАЛЛ

Перепечатано с общедоступного номера: 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 делает это еще проще.