Рубрики
Без рубрики

Введение в WebSockets с Spring

Краткое введение в использование WebSockets с Spring от клиента JS.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы создадим простое веб-приложение, которое реализует обмен сообщениями с использованием новых возможностей WebSocket , представленных в Spring Framework 4.0.

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

Типичным примером использования может быть, когда приложение включает в себя несколько пользователей, общающихся друг с другом, например, в чате. В нашем примере мы построим простой чат-клиент.

2. Зависимости Maven

Поскольку это проект на основе Maven, мы сначала добавим необходимые зависимости в pom.xml :


    org.springframework
    spring-websocket
    5.2.2.RELEASE



    org.springframework
    spring-messaging
    5.2.2.RELEASE

Кроме того, поскольку мы будем использовать JSON для создания тела наших сообщений, нам нужно добавить зависимости Jackson . Это позволяет Spring преобразовать наш объект Java в/из JSON :


    com.fasterxml.jackson.core
    jackson-core
    2.10.2



    com.fasterxml.jackson.core
    jackson-databind 
    2.10.2

Если вы хотите получить самую новую версию библиотек выше, поищите их в Maven Central .

3. Включите WebSocket весной

Первое, что нужно сделать, это включить возможности WebSocket. Для этого нам нужно добавить конфигурацию в наше приложение и аннотировать этот класс с помощью @EnableWebSocketMessageBroker .

Как следует из его названия, он позволяет обрабатывать сообщения WebSocket при поддержке брокера сообщений:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/chat");
         registry.addEndpoint("/chat").withSockJS();
    }
}

Здесь мы видим, что метод configureMessageBroker используется для настройки брокера сообщений . Во-первых, мы позволяем брокеру сообщений в памяти передавать сообщения обратно клиенту по назначениям с префиксом “/topic”.

W e завершите нашу простую конфигурацию, указав префикс “/app” для фильтрации назначений, ориентированных на аннотированные методы приложения (через @MessageMapping ).

Метод registerStompEndpoints регистрирует конечную точку “/chat”, включая Spring STOMP support . Имейте в виду, что мы также добавляем сюда конечную точку, которая работает без SockJS для обеспечения эластичности.

Эта конечная точка с префиксом “/app” является конечной точкой, для обработки которой сопоставлен метод Chat Controller.send () .

Он также включает SockJS резервные опции, чтобы можно было использовать альтернативные варианты обмена сообщениями, если веб-сайты недоступны. Это полезно, так как WebSocket еще не поддерживается во всех браузерах и может быть исключен ограничительными сетевыми прокси-серверами.

Резервные варианты позволяют приложениям использовать API WebSocket, но при необходимости во время выполнения изящно деградируют до альтернатив, отличных от WebSocket.

4. Создайте модель сообщения

Теперь, когда мы настроили проект и настроили возможности WebSocket, нам нужно создать сообщение для отправки.

Конечная точка будет принимать сообщения, содержащие имя отправителя и текст в сообщении STOMP, тело которого является объектом JSON .

Сообщение может выглядеть следующим образом:

{
    "from": "John",
    "text": "Hello!"
}

Чтобы смоделировать сообщение, несущее текст, мы можем создать простой объект Java со свойствами from и text :

public class Message {

    private String from;
    private String text;

    // getters and setters
}

По умолчанию Spring будет использовать библиотеку Jackson для преобразования нашего объекта модели в JSON и из него.

5. Создайте контроллер обработки сообщений

Как мы уже видели, подход Spring к работе с сообщениями STOMP заключается в том, чтобы связать метод контроллера с настроенной конечной точкой. Это стало возможным благодаря аннотации @MessageMapping .

Связь между конечной точкой и контроллером дает нам возможность обрабатывать сообщение при необходимости:

@MessageMapping("/chat")
@SendTo("/topic/messages")
public OutputMessage send(Message message) throws Exception {
    String time = new SimpleDateFormat("HH:mm").format(new Date());
    return new OutputMessage(message.getFrom(), message.getText(), time);
}

Для или целей | нашего примера мы создадим другой объект модели с именем Выходное сообщение для представления выходного сообщения, отправленного в настроенное место назначения . Мы заполняем наш объект отправителем и текстом сообщения, взятым из входящего сообщения, и обогащаем его меткой времени.

После обработки нашего сообщения мы отправляем его в соответствующее место назначения, определенное с помощью аннотации @SendTo . Все подписчики пункта назначения ” /тема/сообщения ” получат сообщение.

6. Создайте клиент браузера

После создания наших конфигураций на стороне сервера мы будем использовать sockjs-клиент библиотеку для создания простой HTML-страницы, которая взаимодействует с нашей системой обмена сообщениями.

Прежде всего, нам нужно импортировать клиентские библиотеки sockjs и stomp Javascript. Затем мы можем создать функцию connect() для открытия связи с нашей конечной точкой, функцию SendMessage() для отправки сообщения STOMP и функцию disconnect() для закрытия связи:


    
        Chat WebSocket
        
        
        
    
    
        


7. Тестирование примера

Чтобы проверить наш пример, мы можем открыть несколько окон браузера и получить доступ к странице чата по адресу:

http://localhost:8080

Как только это будет сделано, мы сможем присоединиться к чату, введя ник и нажав кнопку подключения. Если мы составим и отправим сообщение, мы сможем увидеть его во всех сеансах браузера, которые присоединились к чату.

Взгляните на скриншот, чтобы увидеть пример:

8. Заключение

В этом уроке мы изучили Поддержку WebSocket Spring. Мы видели его конфигурацию на стороне сервера и построили простой клиентский аналог | с использованием библиотек sockjs и stomp Javascript.

Пример кода можно найти в проекте GitHub .