一、项目说明
1、项目地址:https://github.com/hqzmss/test01-springboot-websocket.git
2、IDE:IntelliJ IDEA 2018.1.1 x64
二、步骤说明
Spring Boot实现WebSocket比较简单,主要分以下四步:
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
其他的依赖只涉及到Spring Boot本身的依赖
2、创建拦截器
拦截器要实现【HandshakeInterceptor】这个接口,并实现它的两个方法。
拦截器的主要作用是在WebSocket创建握手之前和之后进行一些相应的处理
package com.hqzmss.websocket_demo1; import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor; import java.util.Map; /**
* 拦截器
*/
public class MyWebSocketInterceptor implements HandshakeInterceptor { /**
* 握手之前调用
* @param serverHttpRequest 当前请求
* @param serverHttpResponse 当前响应
* @param webSocketHandler 目标处理器
* @param map 请求属性
* @return 是否通过
* @throws Exception 异常信息
*/
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
System.out.println("连接前进行处理");
return true;
} /**
* 握手之后调用
* @param serverHttpRequest 当前请求
* @param serverHttpResponse 当前响应
* @param webSocketHandler 目标处理器
* @param e 握手期间引发的异常,如果没有,则为null
*/
@Override
public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
System.out.println("连接后进行处理");
}
}
3、创建处理器
处理器是所有消息的处理中心。
【afterConnectionEstablished】:这个方法会为每个WebSocket连接创建一个WebSocketSession,标识一个连接。
可以将这个WebSocketSession保存起来,以后要是服务器有消息要发送到这个客户端,则通过WebSocketSession直接发送
【handleMessage】:从客户端发来的消息由此方法接收并做相应处理。消息由WebSocketMessage来接收。
package com.hqzmss.websocket_demo1; import org.springframework.web.socket.*; /**
* 创建处理器
*/
public class MyHandler implements WebSocketHandler {
/**
* 在WebSocket协商成功后调用,并且打开WebSocket连接准备使用
* @param webSocketSession webSocketSession
* @throws Exception 异常
*/
@Override
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
System.out.println("sessionId=" + webSocketSession.getId());
} /**
* 当一个新的WebSocket消息到达时调用
* @param webSocketSession webSocketSession
* @param webSocketMessage webSocketMessage
* @throws Exception 异常
*/
@Override
public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
System.out.println(webSocketMessage.getPayload());
System.out.println("有消息到达服务器!");
} /**
* 处理来自底层WebSocket消息传输的错误
* @param webSocketSession webSocketSession
* @param throwable 错误
* @throws Exception 异常
*/
@Override
public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception { } /**
* 在网络套接字连接关闭后或在传输错误发生后调用。
* 尽管从技术上讲,会话可能仍然是开放的,但取决于底层实现,在这一点上发送消息是不鼓励的,而且很可能不会成功。
* @param webSocketSession webSocketSession
* @param closeStatus closeStatus
* @throws Exception 异常
*/
@Override
public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
if(webSocketSession.isOpen()) {
webSocketSession.close();
}
System.out.println("安全退出了系统");
} /**
* WebSocketHandler是否处理部分消息
* @return 标志
*/
@Override
public boolean supportsPartialMessages() {
return false;
}
}
4、添加配置项目
1)、要记得添加@EnableWebSocket注解,标识这个配置是WebSocket配置
2)、"/webSocketServer.action"是自定义的连接点,客户端要通过WebSocket连接此服务器则是通过此连接点
3)、.setAllowedOrigins("*"),这个方法要加上,不加的话有可能连接会被拦截掉
package com.hqzmss.websocket_demo1; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.*; @Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer { @Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(webSocketHandler(), "/webSocketServer.action").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");
webSocketHandlerRegistry.addHandler(webSocketHandler(), "/sockjs/webSocketServer.action")
.addInterceptors(new MyWebSocketInterceptor()).withSockJS();
} @Bean
public WebSocketHandler webSocketHandler() {
return new MyHandler();
}
}