一、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,如果要实现聊天系统,这里就没考虑