Skip to content

WebSocket与STOMP

更新: 7/22/2026 字数: 0 字 时长: 0 分钟

STOMP与WebSocket

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即可

本站访客数 人次      本站总访问量