Введение в WebSockets с помощью Spring

Введение в WebSockets с помощью Spring

1. обзор

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

WebSockets - этоbi-directional,full-duplex,persistent connection между веб-браузером и сервером. Как только соединение WebSocket установлено, соединение остается открытым, пока клиент или сервер не решат закрыть это соединение.

Типичным случаем использования может быть случай, когда в приложении участвуют несколько пользователей, общающихся друг с другом, как в чате. [#result_box]#We will build a simple chat client in our example. #с

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

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


    org.springframework
    spring-websocket
    4.2.4.RELEASE



    org.springframework
    spring-messaging
    4.2.4.RELEASE

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


    com.fasterxml.jackson.core
    jackson-core
    2.7.3



    com.fasterxml.jackson.core
    jackson-databind
    2.7.3

Если вы хотите получить самую новую версию вышеперечисленных библиотек, поищите их на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();
    }
}

Here, we can see that методconfigureMessageBroker используется дляconfigure the message broker. Во-первых, мы разрешаем брокеру сообщений в памяти доставлять сообщения обратно клиенту в пункты назначения с префиксом «/ topic».

We complete our simple, указав префикс «/ app» для фильтрации адресатов, нацеленных на аннотированные методы приложения (через@MessageMapping).

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

Эта конечная точка с префиксом «/ app» является конечной точкой, для обработки которой сопоставляется методChatController.send().

Это такжеenables the SockJS fallback options,, чтобы можно было использовать альтернативные варианты обмена сообщениями, если WebSockets недоступны. Это полезно, поскольку WebSocket еще не поддерживается во всех браузерах и может быть исключен ограничительными сетевыми прокси.

Резервные возможности позволяют приложениям использовать API-интерфейс WebSocket, но при необходимости во время выполнения они постепенно переходят к альтернативам, не относящимся к WebSocket.

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

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

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

Сообщение может выглядеть так:

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

Чтобы смоделировать сообщение, несущее текст, мы можем создать простые свойства_ Java object with _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);
}

For the purposes of our example, we’ll create another model object named OutputMessage to represent the output message sent to the configured destination. Мы заполняем наш объект отправителем и текстом сообщения, взятым из входящего сообщения, и обогащаем его отметкой времени.

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

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

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

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


    
        Chat WebSocket
        
        
        
    
    
        


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

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

http://localhost:8080/spring-mvc-java/resources/chat.html

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

[#result_box .short_text] # Взгляните на снимок экрана, чтобы увидеть пример: #

screenshot

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

В этом руководстве рассматривается поддержкаwe’ve explored Spring WebSocket. Мы видели его конфигурацию на стороне сервера и построили простойcounterpart на стороне клиента с использованием библиотек Javascriptsockjs иstomp.

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