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的主要内容,如果未能解决你的问题,请参考以下文章
WebSocket 握手 - 意外响应代码 200 - AngularJs 和 Spring Boot
WebSocket握手期间出错:意外的响应代码:400 Spring boot websockets