springboot搭建stomp协议的websocket

1,634 阅读2分钟

一、stomp和websocket的关系

websocket是建立在http协议之上的一个应用层协议,底层也都是通过TCP来实现通讯的

STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互

STOMP协议可以建立在WebSocket之上,也可以建立在其他应用层协议之上。

二、代码

先创建一个springboot项目 端口 9700 ip就用本地 localhost,这里就不列出来了 然后 创建相关配置类

依赖 maven

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-websocket</artifactId>
   <version>2.3.0.RELEASE</version>
</dependency>

gradle

 compile 'org.springframework.boot:spring-boot-starter-websocket:2.3.0.RELEASE'
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {

    /**
     * 注册 Stomp的端点 配置对外暴露访问的端点
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket")   //添加STOMP协议的端点。
                // 这个URL是供WebSocket客户端或SockJS客户端连接服务端访问的地址。
                .setAllowedOrigins("*") //添加允许跨域访问
                .withSockJS();  //指定端点使用SockJS协议
    }

    /**
     * 配置消息代理
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //启动简单Broker,客户端请求地址符合配置的前缀,消息才会发送到这个broker
        //客户端订阅当前服务端时需要添加以下请求前缀,topic一般用于广播推送,queue用于点对点推送
        registry.enableSimpleBroker("/api","/boss");

        //指定用户发送(一对一)的前缀 /user/
        registry.setUserDestinationPrefix("/user");
        //客户端(html客户端、java客户端等)向服务端发送消息的请求前缀
        registry.setApplicationDestinationPrefixes("/app");
    }

}


然后后端接收前端的消息 创建一个restcontroller

@Slf4j
@RestController
public class WebScoketController {

    
    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

  
    /**
     * 发送消息给前端
     * @param message
     */
    @PostMapping("sendMessage")
    public void sendMessage(String message) {
        simpMessagingTemplate.convertAndSend("/api/test",message);
    }
    
    
}

前端接收服务端的消息 为了方便直接创建一个 html

引入js

<script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
<script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script>

body里面写js


<script>

var socket = new SockJS("http://localhost:9700/websocket");
    var stompClient = Stomp.over(socket);
 
    stompClient.connect('','',function(frame){
        stompClient.subscribe("/api/test", function(message) {
            alert(JSON.parse(message.body)); //收到消息
        });
    });

</script>


这里只演示服务端向浏览器推送消息,浏览器发送消息的话 可以直接使用http,如果要实现聊天系统,这里就没考虑