Websocket简介
WebSocket为浏览器和服务端提供了双工异步通信的功能,即浏览器可以向服务端发送消息,服务端也可以向浏览器发送消息。WebSocke是通过一个socket来实现双工异步通信。但是直接使用WebSocket协议开发程序显得特别繁琐,可以使用它的子协议STOMP,它是一个更高级的协议,STOMP协议使用一个基于帧的格式来定义消息,与HTTP的request和response类似。
Spring Boot支持
springboot对于内嵌的tomcat7使用websocket提供了支持,配置源码存于:
org.springframework.boot.autoconfigure.websocket
springboot提供的stater pom是spring boot starter websocket
配置开启WebSocket支持
@Configuration
@EableWebSocketMessageBroker
开启websocket支持,使用STOMP协议传输基于代理的消息(message broker),控制器支持@MessageMapping
public class *** extends AbstractWebsocketMessageBrokerConfigurer
//注册STOMP协议的节点(endpoint),并映射的指定的URL,使用SockJS协议
public void registerStompEndPoints(StompEndPointRegistry registry){
registry.addEndPoint("/endpointWisely").withSockJS();
registry.addEndPoint("/endpointChat").withSockJS();
}
配置消息代理(广播式,点对点式)
public void configureMessageBroker(MessageBrokerRegistry registry){
registry.enableSimpleBroker("/topic","/queue");
}
控制器
浏览器向服务端发送请求,通过@MessageMapping映射的地址
服务端有消息,会对订阅了@sendTo中的路径的浏览器发送消息
@MessageMapping
@SendTo("/topic/getResponse")
服务端通过SimMessageTemplate向浏览器发送消息
通过SimMessageTemplate.convertAndSendUser向用户发送消息,第一个参数是接收消息的用户,第二个参数是浏览器订阅的地址,第三个参数是消息本身
页面
添加脚本到src/main/resources/static下
stomp.min.js(STOMP协议的客户端脚本)
sockjs.min.js(SockJS的客户端脚本)
JQuery
连接SockJS的endpoint
var socket = new SockJS('/endpoint节点');
var socket = new SockJS('/endpointWisely');
var socket = new SockJS('/endpointChat');
使用STOMP子协议的WebSocket客户端
var stompClient = Stomp.over(socket);
连接WebSocket服务端
stompClient.connect
通过websocket客户端stompClient.subscribe订阅广播地址/topic/getResponse目标发送的消息
stompClient.subscribe('/topic/getResponse',function(response){
showResponse(JSON.parse(response.body).responseMessage);
}
通过stompClient.send向/welcome(@MessageMapping映射地址)发送消息
stompClient.send("/welcome",{},JSON.stringify({'name':name}));