服务端消息推送技术-WebSocket
WebSocket介绍
websocket是一个全双工的高性能的服务端推送技术,基于ws协议实现通讯
spring集成webSocket
SSM
导入依赖
<!-- webSocket -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
编写配置类
/**
* WebSocket 配置
*/
@Component
@EnableWebSocket
public class MyWebSocketConfig implements WebSocketConfigurer {
// 消息处理
@Autowired
private WebSocketHandler webSocketHandler;
// 消息拦截器
@Autowired
private WebSocketIntercept webSocketIntercept;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
// 把消息处理器和连接器注册到服务里面
webSocketHandlerRegistry.addHandler(webSocketHandler, "/ws").addInterceptors(webSocketIntercept);
}
}
消息处理类
/**
* Handler 处理器
*/
@Component
public class WebSocketConfiguration implements WebSocketHandler {
// 定义一个线程安全的 HashMap 存储 Web Socket
ConcurrentHashMap<String, WebSocketSession> concurrentHashMap = new ConcurrentHashMap<>();
/**
* 握手成功之后自动执行的方法
*
* @param session 用户的 session
* @throws Exception 异常
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 获取当前登录的用户信息
Object loginUser = session.getAttributes().get("loginUser");
concurrentHashMap.put(loginUser.toString(), session);
}
/**
* 处理消息
*
* @param session socket session
* @param message 消息
* @throws Exception 异常
*/
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
// 判断消息的长度如果消息是空就直接返回
if (message.getPayloadLength() == 0) return;
Gson gson = new Gson();
// 把消息转换成 TextMessage 对象
TextMessage textMessage = gson.fromJson(message.getPayload().toString(), TextMessage.class);
// TODO 发送消息
}
/**
* 当发生错误的时候会执行这个代码块
*/
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
System.out.println("消息错误");
}
// 链接关闭执行一下代码块
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
System.out.println("连接关闭");
}
/**
* 是否支持拆分消息
*
* @return true 代表 返回拆分消息
*/
@Override
public boolean supportsPartialMessages() {
return false;
}
}