1、背景html
2、具體分析前端
一、交互的過程則要求前端和後臺都能主動發起請求,這有區別於常見的httpweb
二、websocket的定義:spring
一種在單個TCP鏈接上進行全雙工通訊(雙向通訊)的協議後端
三、概述:跨域
3、實現瀏覽器
一、端點信息設置websocket
1 @Configuration 2 @EnableWebSocketMessageBroker //啓動websocket端點 3 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { 4 5 /** 6 * 握手攔截器 7 */ 8 @Autowired 9 private WsHandShakeInterceptor wsHandShakeInterceptor; 10 /* (non-Javadoc) 11 * @see org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer#registerStompEndpoints(org.springframework.web.socket.config.annotation.StompEndpointRegistry) 12 */ 13 @Override 14 public void registerStompEndpoints(StompEndpointRegistry registry) { 15 registry 16 .addEndpoint("/ws")//設置端點名稱 17 .setHandshakeHandler(new MyPrincipalHandshakeHandler()) //設置義用戶和websocket的綁定策略,如新用戶使用session以及用戶的校驗,是否登陸,返回Principal實現類 18 // .setAllowedOrigins("*") // 添加容許跨域訪問 19 // .setAllowedOrigins("http://mydomain.com"); 20 .addInterceptors(wsHandShakeInterceptor) // 添加自定義攔截,如握手前設置上下文信息 21 .withSockJS(); //withSockJS容許客戶端利用sockjs進行瀏覽器兼容性處理 22 } 23 24 /* (non-Javadoc) 25 * @see org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer#configureMessageBroker(org.springframework.messaging.simp.config.MessageBrokerRegistry) 26 */ 27 @Override 28 public void configureMessageBroker(MessageBrokerRegistry registry) { 29 registry.setApplicationDestinationPrefixes("/app");//設置客戶端訂閱消息的基礎邏輯,默認也是這個,前端url中提現 30 registry.enableSimpleBroker("/topic"); // 設置服務端廣播消息的基礎路徑,默認也是這個,後端提現 31 32 33 // Use this for enabling a Full featured broker like RabbitMQ 34 35 /* 36 registry.enableStompBrokerRelay("/topic") 37 .setRelayHost("localhost") 38 .setRelayPort(61613) 39 .setClientLogin("guest") 40 .setClientPasscode("guest"); 41 */ 42 } 43 }
二、contoller設置session
1 @Controller 2 public class WebSocketAction { 3 4 private Logger logger = LoggerFactory.getLogger(this.getClass()); 5 6 @MessageMapping("/sendTest") 7 @SendTo("/topic/subscribeTest") //結果推送客戶端,訂閱了/topic/subscribeTest的客戶端 8 public ServerMessage sendDemo(ClientMessage message) { 9 logger.info("接收到了信息" + message.getName()); 10 return new ServerMessage("你發送的消息爲:" + message.getName()); 11 } 12 13 @SubscribeMapping("/subscribeTest") 14 public ServerMessage sub() { 15 logger.info("XXX用戶訂閱了我。。。"); 16 return new ServerMessage("感謝你訂閱了我。。。"); 17 } 18 19 }
ps:app
一、@MessageMapping(「/sendTest」) 接收客戶端發送的信息,發送的url是/app/sendTest(經由消息代理)
二、@SubscribeMapping(「/subscribeTest」) ,和MessageMapping功能相似,不經由消息代理
三、@SendTo(「/topic/subscribeTest」) 返回目的地的地址,經由消息代理,全部訂閱改路徑的客戶端都能收到
四、@SendToUser(value = "/topic/greetings",broadcast = false) 與sendTo功能相似,但只有訂閱了改路徑的消息發起者能收到信息
五、SimpMessageSendingOperations.convertAndSend("/topic/public", chatMessage) 等價於@SendTo
六、@Payload 將消息和對象綁定
參見:
http://www.cnblogs.com/jmcui/p/8999998.html