WebSocket是一种计算机通信协议,可通过单个TCP连接提供全双工通信渠道。 Websocket与HTTP不同。该协议可以在Web浏览器(或其他客户端应用程序)和具有低于Half Duplex替代方案的Web服务器(例如HTTP轮询)之间进行交互,从而促进了从服务器和服务器的实时数据传输。
一旦在客户端和服务器之间建立了Websocket连接,两者都可以交换信息,直到任何当事方关闭连接为止。
当构建以低延迟的高频运行时,这是websocket优于HTTP协议优先的主要保证。
简单(或流)面向文本的消息协议(Stomp),以前称为TTMP,是一个简单的基于文本的协议,旨在与面向消息的中间件(MOM)一起工作。它提供了一种可互操作的电线格式,使脚步客户端可以与支持协议的任何消息经纪人交谈。
由于Websocket只是一个通信协议,因此它不知道如何向特定用户发送消息。 Stomp基本上是一种消息协议,对这些功能很有用。
我们的应用程序将具有以下配置,可以使用Spring Initializr:
Java版本:11
类型:Maven项目
依赖项:websocket
春季启动版本: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注释用于启用我们的WebSocket服务器。
WebSocketMessageBrokerConfigurer接口用于为其配置WebSocket连接的某些方法提供实现。
registerStompendPoints方法用于注册客户端将用于连接到服务器的Websocket端点。
ConfigureMessageBroker方法用于配置我们的消息代理,该消息将用于将消息从一个客户端路由到另一个客户端。
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注释的这些处理方法。
我们的UI是使用HTML和CSS构建的简单卡片盒,该卡片可以运行一些JS函数以发送和接收消息。