Spring Boot之WebSocket

Posted 深海云帆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot之WebSocket相关的知识,希望对你有一定的参考价值。

一、项目说明

1、项目地址:https://github.com/hqzmss/test01-springboot-websocket.git

2、IDE:IntelliJ IDEA 2018.1.1 x64

二、步骤说明

Spring Boot实现WebSocket比较简单,主要分以下四步:

1、添加依赖

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-websocket</artifactId>
4 </dependency>

其他的依赖只涉及到Spring Boot本身的依赖

2、创建拦截器

拦截器要实现【HandshakeInterceptor】这个接口,并实现它的两个方法。

拦截器的主要作用是在WebSocket创建握手之前和之后进行一些相应的处理

 1 package com.hqzmss.websocket_demo1;
 2 
 3 import org.springframework.http.server.ServerHttpRequest;
 4 import org.springframework.http.server.ServerHttpResponse;
 5 import org.springframework.web.socket.WebSocketHandler;
 6 import org.springframework.web.socket.server.HandshakeInterceptor;
 7 
 8 import java.util.Map;
 9 
10 /**
11  * 拦截器
12  */
13 public class MyWebSocketInterceptor implements HandshakeInterceptor {
14 
15     /**
16      * 握手之前调用
17      * @param serverHttpRequest 当前请求
18      * @param serverHttpResponse 当前响应
19      * @param webSocketHandler 目标处理器
20      * @param map 请求属性
21      * @return 是否通过
22      * @throws Exception 异常信息
23      */
24     @Override
25     public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
26         System.out.println("连接前进行处理");
27         return true;
28     }
29 
30     /**
31      * 握手之后调用
32      * @param serverHttpRequest 当前请求
33      * @param serverHttpResponse 当前响应
34      * @param webSocketHandler 目标处理器
35      * @param e 握手期间引发的异常,如果没有,则为null
36      */
37     @Override
38     public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
39         System.out.println("连接后进行处理");
40     }
41 }
42  

3、创建处理器

处理器是所有消息的处理中心。

【afterConnectionEstablished】:这个方法会为每个WebSocket连接创建一个WebSocketSession,标识一个连接。

              可以将这个WebSocketSession保存起来,以后要是服务器有消息要发送到这个客户端,则通过WebSocketSession直接发送

【handleMessage】:从客户端发来的消息由此方法接收并做相应处理。消息由WebSocketMessage来接收。

 1 package com.hqzmss.websocket_demo1;
 2 
 3 import org.springframework.web.socket.*;
 4 
 5 /**
 6  * 创建处理器
 7  */
 8 public class MyHandler implements WebSocketHandler  {
 9     /**
10      * 在WebSocket协商成功后调用,并且打开WebSocket连接准备使用
11      * @param webSocketSession webSocketSession
12      * @throws Exception 异常
13      */
14     @Override
15     public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
16         System.out.println("sessionId=" + webSocketSession.getId());
17     }
18 
19     /**
20      * 当一个新的WebSocket消息到达时调用
21      * @param webSocketSession webSocketSession
22      * @param webSocketMessage webSocketMessage
23      * @throws Exception 异常
24      */
25     @Override
26     public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
27         System.out.println(webSocketMessage.getPayload());
28         System.out.println("有消息到达服务器!");
29     }
30 
31     /**
32      * 处理来自底层WebSocket消息传输的错误
33      * @param webSocketSession webSocketSession
34      * @param throwable 错误
35      * @throws Exception 异常
36      */
37     @Override
38     public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
39 
40     }
41 
42     /**
43      * 在网络套接字连接关闭后或在传输错误发生后调用。
44      * 尽管从技术上讲,会话可能仍然是开放的,但取决于底层实现,在这一点上发送消息是不鼓励的,而且很可能不会成功。
45      * @param webSocketSession webSocketSession
46      * @param closeStatus closeStatus
47      * @throws Exception 异常
48      */
49     @Override
50     public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
51         if(webSocketSession.isOpen()) {
52             webSocketSession.close();
53         }
54         System.out.println("安全退出了系统");
55     }
56 
57     /**
58      * WebSocketHandler是否处理部分消息
59      * @return 标志
60      */
61     @Override
62     public boolean supportsPartialMessages() {
63         return false;
64     }
65 }

4、添加配置项目

 1)、要记得添加@EnableWebSocket注解,标识这个配置是WebSocket配置

 2)、"/webSocketServer.action"是自定义的连接点,客户端要通过WebSocket连接此服务器则是通过此连接点

 3)、.setAllowedOrigins("*"),这个方法要加上,不加的话有可能连接会被拦截掉

 1 package com.hqzmss.websocket_demo1;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 import org.springframework.web.socket.WebSocketHandler;
 6 import org.springframework.web.socket.config.annotation.*;
 7 
 8 @Configuration
 9 @EnableWebSocket
10 public class WebSocketConfig implements  WebSocketConfigurer {
11 
12     @Override
13     public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
14         webSocketHandlerRegistry.addHandler(webSocketHandler(), "/webSocketServer.action").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");
15         webSocketHandlerRegistry.addHandler(webSocketHandler(), "/sockjs/webSocketServer.action")
16                 .addInterceptors(new MyWebSocketInterceptor()).withSockJS();
17     }
18 
19     @Bean
20     public WebSocketHandler webSocketHandler() {
21         return new MyHandler();
22     }
23 }

 

以上是关于Spring Boot之WebSocket的主要内容,如果未能解决你的问题,请参考以下文章

spring boot项目之webSocket消息推送

WebSocket 握手 - 意外响应代码 200 - AngularJs 和 Spring Boot

WebSocket握手期间出错:意外的响应代码:400 Spring boot websockets

Spring Boot - WebSocket 握手期间出错

spring boot Websocket(使用笔记)

Spring Boot + Websocket + Thymeleaf + Lombok