WebSocket与STOMP
更新: 7/22/2026 字数: 0 字 时长: 0 分钟
WebSocket简介
WebSocket是用于解决服务端和客户端双向通信的问题,其本身基于TCP协议,实现了长连接的功能,其在握手阶段仍然采用Http协议,需要从Http协议升级而来
STOMP协议
STOMP本身并非为WS设计,他只是一种消息队列的协议,与ASMQ,JMS一样,但其简单的特性恰好可以用来定义WS的消息体的格式
目前很多的消息队列服务都支持了STOMP吗,比如RabbitMQ,ActiveMQ等,很多语言自身也有STOMP的客户端解析库
STOMP只是文本传输协议,不参与通信细节,我们可以将它视为一个简单的消息订阅模式,客户端和服务端都可以推送接受消息,而且它支持灵活的根据topic进行消息分发
WebSocket结合STOMP就实现了一个消息队列,服务端和客户端都可以作为生产者和消费者,根据订阅的队列的不哦那个是实现单播,广播和多播(WebSocket是点对点通信,所以广播和多播都只是服务端轮询客户端发送实现的)
SpringBoot实现WebSocket和STOMP
SpringBoot做了极其方便的STOMP整合,我们可以通过熟悉的Controller模式与SimpMessagingTemplate实现消息的发送
我们可以直接使用SimpMessagingTemplate来向指定的Topic中发送消息,例如
java
messagingTemplate.convertAndSend("/topic/public",
ChatMessage.of(ChatMessage.Type.JOIN, username, username + " 加入了聊天室"));
package cn.cotenite.stomp.model;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* 聊天消息体。STOMP 支持消息体自动序列化/反序列化(JSON),
* 客户端发 JSON 帧体,服务端直接拿到 Java 对象,这是相比原生 WebSocket 的一大优势。
*/
@Data
public class ChatMessage {
public enum Type {
CHAT, // 公共频道消息
PRIVATE, // 私聊消息
JOIN, // 加入通知
LEAVE, // 离开通知
TYPING // 正在输入
}
private Type type;
private String sender;
private String recipient;
private String content;
private String time;
public ChatMessage() {
}
public static ChatMessage of(Type type, String sender, String content) {
ChatMessage message = new ChatMessage();
message.setType(type);
message.setSender(sender);
message.setContent(content);
message.setTime(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")));
return message;
}
}当服务端和客户端建立连接后Spring就会维护一个topic和地址(习惯用/进行分割)的哈希表,这样用户就不用担心发送消息给谁的问题,直接操作topic即可