文章字数:245,阅读全文大约需要1分钟
springWebSocket还有一种形式,除了事件绑定的形式还有基于观察者模式(发布-订阅)的绑定topic
形式
环境
springBoot的websocket的starter包
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
|
配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/socket").withSockJS(); }
@Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } }
|
端点连接还可以配置允许跨域
1 2 3 4 5 6 7 8 9
| registry.addEndpoint("/socket").addInterceptors(new HandshakeInterceptor(){ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes){ response.getHeaders().add("Access-Control-Allow-Origin", "*"); return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { }}).setAllowedOrigins("*").withSockJS();
|
服务端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Controller public class GreetingController { @Resource private SimpMessagingTemplate simpMessagingTemplate;
@MessageMapping("/change-notice") public void greeting(String value){ this.simpMessagingTemplate.convertAndSend("/topic/notice", value); }
@MessageMapping("/change-notice") @SendTo("/topic/notice") public String greeting(String value) { return value; } }
|
客户端
准备
socketjs.js
:如果浏览器不支持webSocket
,改库可以模拟对webSocket
的支持
stomp.js
:将webSocket
代理代码简易化的框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function connect(){ var socket = new SocketJS('/socket'); stompClient = Stomp.over(socket); stompClient.connect({}, function (frame) { });
stompClient.disconnect();
stompClient.send("/app/change-notice", {}, value); }
stompClient.subscribe('/topic/notice', function (data) { $('.message span.content').html(data.body); });
|