WebSocket-это компьютерный протокол связи, обеспечивающий полномулуплексные каналы связи над одним соединением TCP. WebSocket отличается от HTTP. Протокол обеспечивает взаимодействие между веб-браузером (или другим клиентским приложением) и веб-сервером с более низкими накладными расходами, чем полудуплексные альтернативы, такие как опросы HTTP, облегчая передачу данных в реальном времени с и на сервере.
После того, как соединение WebSocket будет установлено между клиентом и сервером, оба могут обмениваться информацией, пока соединение не будет закрыто любой из сторон.
Это основная графика, которую предпочтительнее WebSocket в отношении протокола HTTP при создании услуги связи, подобного чату, который работает на высоких частотах с низкой задержкой.
Простой (или потоковой) протокол сообщений, ориентированный на текст (Stomp), ранее известный как TTMP, представляет собой простой текстовый протокол, предназначенный для работы с промежуточным программным обеспечением (MOM). Он обеспечивает совместимый формат проводов, который позволяет клиентам STOMP разговаривать с любым брокером сообщений, поддерживающим протокол.
Поскольку WebSocket - это просто протокол связи, он не знает, как отправить сообщение конкретному пользователю. Stomp - это в основном протокол обмена сообщениями, который полезен для этих функций.
Наше приложение будет иметь следующую конфигурацию, которая может быть установлена с помощью Spring Initiazr:
Java версия: 11
Тип: проект Maven
Зависимости: WebSocket
Версия Boot Spring: 2.4.2
Настройка нашей конечной точки WebSocket и брокера сообщений довольно проста.
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
@Enablewebsocketmessagebroker Annotation используется для включения нашего сервера WebSocket.
Интерфейс websocketmessagebrokerconfigurer используется для предоставления реализации для некоторых из своих методов для настройки соединения WebSocket.
Метод RegisterStompendpoints используется для регистрации конечной точки WebSocket, которую клиенты будут использовать для подключения к серверу.
Метод ConfiguRUremessAgeBroker используется для настройки нашего брокера сообщения, который будет использоваться для маршрутизации сообщений от одного клиента на другой.
Sockjs также используется для предоставления вариантов резерва для браузеров, которые не поддерживают WebSocket.
Наша модель чата - это полезная нагрузка сообщения, которая будет обменена между клиентской стороной и серверной стороной приложения.
public class ChatMessage {
private String content;
private String sender;
private MessageType type;
public enum MessageType {
*CHAT*, *LEAVE*, *JOIN
*}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public MessageType getType() {
return type;
}
public void setType(MessageType type) {
this.type = type;
}
}
Наш контроллер будет нести ответственность за обработку всех методов сообщений, присутствующих в нашем приложении в чате, которое в основном будет получать сообщения от одного клиента, а затем транслировать их другим.
@Controller
public class ChatController {
@MessageMapping("/chat.register")
@SendTo("/topic/public")
public ChatMessage register(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
@MessageMapping("/chat.send")
@SendTo("/topic/public")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
return chatMessage;
}
}
Использование /приложение в качестве пункта назначения происходит из -за нашего файла конфигурации WebSocket, в котором говорится, что все сообщения будут направлены на эти методы обработки, аннотированные с помощью @messagemapping.
Наш пользовательский интерфейс представляет собой простую карточную коробку с использованием HTML и CSS, которая запускает некоторые функции JS для отправки и получения сообщений.