002649:websocket的使用及其定义
一、背景
1、最近公司要做一個網(wǎng)頁上智能收集投訴信息的功能(客戶端和小蜜(后臺寫死的聊天邏輯)聊天的過程收集投訴信息)。
2、流程:消費者按固定流程輸入或選擇投訴信息->確認(rèn)投訴信息->后臺生成和解方案->消費者同意/不同意->商家處理待處理的和解信息->消費者查看商家的處理結(jié)果。
二、具體分析
1、交互的過程則要求前端和后臺都能主動發(fā)起請求,這有區(qū)別于常見的http
2、websocket的定義:
一種在單個TCP連接上進行全雙工通信(雙向通信)的協(xié)議
3、概述:
a、HTML5中提出的
b、相比HTTP:
b.1、前者一個request一個response,websocket采用的是訂閱模式且客戶端和服務(wù)端都可以想對方推送消息。
b.2、前者是短連接,每次都是一個請求一個響應(yīng),然后就結(jié)束了。后者采用的是長連接(一次驗證,長期有效),websocket實現(xiàn)消息的轉(zhuǎn)發(fā)
三、實現(xiàn)
1、端點信息設(shè)置
1 @Configuration
2 @EnableWebSocketMessageBroker //啟動websocket端點
3 public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
4
5 /**
6 * 握手?jǐn)r截器
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")//設(shè)置端點名稱
17 .setHandshakeHandler(new MyPrincipalHandshakeHandler()) //設(shè)置義用戶和websocket的綁定策略,如新用戶使用session以及用戶的校驗,是否登錄,返回Principal實現(xiàn)類
18 // .setAllowedOrigins("*") // 添加允許跨域訪問
19 // .setAllowedOrigins("http://mydomain.com");
20 .addInterceptors(wsHandShakeInterceptor) // 添加自定義攔截,如握手前設(shè)置上下文信息
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");//設(shè)置客戶端訂閱消息的基礎(chǔ)邏輯,默認(rèn)也是這個,前端url中提現(xiàn)
30 registry.enableSimpleBroker("/topic"); // 設(shè)置服務(wù)端廣播消息的基礎(chǔ)路徑,默認(rèn)也是這個,后端提現(xiàn)
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 }
2、contoller設(shè)置
1 @Controller
2 public class WebSocketAction {
3
4 private Logger logger = LoggerFactory.getLogger(this.getClass());
5
6 @MessageMapping("/sendTest")
7 @SendTo("/topic/subscribeTest") //結(jié)果推送客戶端,訂閱了/topic/subscribeTest的客戶端
8 public ServerMessage sendDemo(ClientMessage message) {
9 logger.info("接收到了信息" + message.getName());
10 return new ServerMessage("你發(fā)送的消息為:" + message.getName());
11 }
12
13 @SubscribeMapping("/subscribeTest")
14 public ServerMessage sub() {
15 logger.info("XXX用戶訂閱了我。。。");
16 return new ServerMessage("感謝你訂閱了我。。。");
17 }
18
19 }
ps:
1、@MessageMapping(“/sendTest”)接收客戶端發(fā)送的信息,發(fā)送的url是/app/sendTest(經(jīng)由消息代理)
2、@SubscribeMapping(“/subscribeTest”),和MessageMapping功能類似,不經(jīng)由消息代理
3、@SendTo(“/topic/subscribeTest”) 返回目的地的地址,經(jīng)由消息代理,所有訂閱改路徑的客戶端都能收到
4、@SendToUser(value = "/topic/greetings",broadcast = false) 與sendTo功能類似,但只有訂閱了改路徑的消息發(fā)起者能收到信息
5、SimpMessageSendingOperations.convertAndSend("/topic/public", chatMessage) 等價于@SendTo
6、@Payload 將消息和對象綁定
參見:
http://www.cnblogs.com/jmcui/p/8999998.html
總結(jié)
以上是生活随笔為你收集整理的002649:websocket的使用及其定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析PostgreSQL序列(SEQUE
- 下一篇: webMagic学习系列:downloa