三, 实现
1, 端点信息设置
- @Configuration
- @EnablewebSocketMessageBroker // 启动 websocket 端点
- public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
- /**
- * 握手拦截器
- */
- @Autowired
- private WsHandShakeInterceptor wsHandShakeInterceptor;
- /* (non-Javadoc)
- * @see org.springframework.Web.socket.config.annotation.WebSocketMessageBrokerConfigurer#registerStompEndpoints(org.springframework.Web.socket.config.annotation.StompEndpointRegistry)
- */
- @Override
- public void registerStompEndpoints(StompEndpointRegistry registry) {
- registry
- .addEndpoint("/ws")// 设置端点名称
- .setHandshakeHandler(new MyPrincipalHandshakeHandler()) // 设置义用户和 websocket 的绑定策略, 如新用户使用 session 以及用户的校验, 是否登录, 返回 Principal 实现类
- // .setAllowedOrigins("*") // 添加允许跨域访问
- // .setAllowedOrigins("http://mydomain.com");
- .addInterceptors(wsHandShakeInterceptor) // 添加自定义拦截, 如握手前设置上下文信息
- .withSockJS(); //withSockJS 允许客户端利用 sockjs 进行浏览器兼容性处理
- }
- /* (non-Javadoc)
- * @see org.springframework.Web.socket.config.annotation.WebSocketMessageBrokerConfigurer#configureMessageBroker(org.springframework.messaging.simp.config.MessageBrokerRegistry)
- */
- @Override
- public void configureMessageBroker(MessageBrokerRegistry registry) {
- registry.setApplicationDestinationPrefixes("/app");// 设置客户端订阅消息的基础逻辑, 默认也是这个, 前端 url 中提现
- registry.enableSimpleBroker("/topic"); // 设置服务端广播消息的基础路径, 默认也是这个, 后端提现
- // Use this for enabling a Full featured broker like RabbitMQ
- /*
- registry.enableStompBrokerRelay("/topic")
- .setRelayHost("localhost")
- .setRelayPort(61613)
- .setClientLogin("guest")
- .setClientPasscode("guest");
- */
- }
- }
2,contoller 设置
- @Controller
- public class WebSocketAction {
- private Logger logger = LoggerFactory.getLogger(this.getClass());
- @MessageMapping("/sendTest")
- @SendTo("/topic/subscribeTest") // 结果推送客户端, 订阅了 / topic/subscribeTest 的客户端
- public ServerMessage sendDemo(ClientMessage message) {
- logger.info("接收到了信息" + message.getName());
- return new ServerMessage("你发送的消息为:" + message.getName());
- }
- @SubscribeMapping("/subscribeTest")
- public ServerMessage sub() {
- logger.info("XXX 用户订阅了我...");
- return new ServerMessage("感谢你订阅了我...");
- }
- }
- ps:
1,@MessageMapping("/sendTest") 接收客户端发送的信息, 发送的 url 是 / App/sendTest(经由消息代理)
2,@SubscribeMapping("/subscribeTest"), 和 MessageMapping 功能类似, 不经由消息代理
3,@SendTo("/topic/subscribeTest") 返回目的地的地址, 经由消息代理, 所有订阅改路径的客户端都能收到
4,@SendToUser(value = "/topic/greetings",broadcast = false) 与 sendTo 功能类似, 但只有订阅了改路径的消息发起者能收到信息
来源: http://www.bubuko.com/infodetail-2960641.html