一、配置类解析
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic");
registry.setUserDestinationPrefix("/user");
}
}
其中
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
这一句的意思
允许使用socketJs方式访问,访问点为webSocketServer,允许跨域
在网页上我们就可以通过这个链接
http://localhost:8080/ws
来和服务器的WebSocket连接
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic");
registry.setUserDestinationPrefix("/user");
}
registry.setApplicationDestinationPrefixes("/app");
指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
registry.enableSimpleBroker("/topic");
用户订阅主题的前缀
/topic 代表发布广播,即群发
/queue 代表点对点,即发指定用
这些可以自定义的
registry.setUserDestinationPrefix("/user");
二、一些方法上的注解
2.1 @MessageMapping(“/sendTest”)
接收客户端发送的消息,当客户端发送消息的目的地为/app/sendTest时,交给该注解所在的方法处理消息,其中/app是在
registry.setApplicationDestinationPrefixes("/app");
2.2@SubscribeMapping(“/subscribeTest”)
接受客户端订阅的处理,这个可以放controller中的具体一个方法中,然后在这个方法中可以做一些记录,如想记录历史订阅信息等…
当客户端订阅的目的地为/app/subscribeTest时,交给该注解所在的方法处理订阅,其中/app为客户端请求前缀
若没有添加@SendTo注解且该方法有返回值,则返回的目的地地址为**/app/sendTest**,不经过消息代理,客户端需要订阅了这个主题才能收到返回消息
2.3@SendTo(“/topic/subscribeTest”)
一般来说,假如不加SendTo就会默认原路返回,比如有一个
@MessageMapping("/sendTest") 返回的信息就是/app/sendTest
若没有添加@SendTo注解且该方法有返回值,则返回的目的地地址为/topic/sendTest,经过消息代理,客户端需要订阅了这个主题才能收到返回消息
而SendTo就会直接修改返回地址,使得其经过消息代理,客户端需要订阅了这个主题才能收到返回消息。
网上有一张图总结得很到位,来自https://blog.csdn.net/qq_28988969/article/details/78113463