webSocket集成
pom集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置类
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Resource
private WebSocketInterceptor webSocketInterceptor;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry
.addHandler(myHandler(), "/ws")
.setAllowedOrigins("*")
.addInterceptors(webSocketInterceptor);
}
@Bean
public WebSocketHandler myHandler() {
return new MyWebSocketHandler();
}
}
拦截器
@Component
@Slf4j
public class WebSocketInterceptor implements HandshakeInterceptor {
@Autowired
private CustomSessionManager customSessionManager;
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Map<String, Object> attributes) {
ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
String token = serverHttpRequest.getServletRequest().getParameter("token");
if (StringUtils.isEmpty(token)) {
return false;
}
AdminSession adminSession = null;
try {
adminSession = customSessionManager.getSessionById(token);
} catch (Exception e) {
log.info("webSocket鉴权失败 token = {}", token);
}
if (ObjectUtil.isEmpty(adminSession)) {
return false;
}
attributes.put("uid", adminSession.getId());
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
Exception exception) {
}
}
业务实现
@Slf4j
@Component
public class MyWebSocketHandler extends TextWebSocketHandler {
private static AtomicInteger onlineNum = new AtomicInteger();
private static ConcurrentHashMap<Integer, List<WebSocketSession>> sessionPools = new ConcurrentHashMap<>();
public static void addOnlineCount() {
onlineNum.incrementAndGet();
}
public static void subOnlineCount() {
onlineNum.decrementAndGet();
}
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
log.info("接收到用户: {} 发来的消息: {}", session.getAttributes().get("uid"), message.getPayload());
NewOrderGoods newOrderGoods = new NewOrderGoods();
switch(message.getPayload()){
case "1":
newOrderGoods.setId(9109L);
newOrderGoods.setOrderCode("1017431853084180480");
sendOrderCreate(newOrderGoods);
break;
case "2":
newOrderGoods.setId(9110L);
newOrderGoods.setOrderCode("1017432921394380800");
sendOrderRefund(newOrderGoods);
break;
default:
break;
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
String uid = session.getAttributes().get("uid").toString();
int uidInteger = Integer.parseInt(uid);
boolean flag = sessionPools.containsKey(uidInteger);
List<WebSocketSession> put =null;
if (flag){
List<WebSocketSession> webSocketSessions = sessionPools.get(uidInteger);
webSocketSessions.add(session);
put = sessionPools.put(uidInteger, webSocketSessions);
}else{
ArrayList<WebSocketSession> webSocketSessions = new ArrayList<>();
webSocketSessions.add(session);
put = sessionPools.put(uidInteger,webSocketSessions);
}
if (put == null) {
addOnlineCount();
}
log.info("webSocket鉴权成功! 用户id = {}", session.getAttributes().get("uid"));
session.sendMessage(new TextMessage("连接成功 当前在线人数: " + onlineNum));
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
String uid = session.getAttributes().get("uid").toString();
sessionPools.remove(Integer.parseInt(uid));
subOnlineCount();
log.info("用户: {}断开连接",uid);
}
public void sendTopic(String message) {
if (sessionPools.isEmpty()) {
return;
}
TextMessage textMessage = new TextMessage(message);
for (Map.Entry<Integer, List<WebSocketSession>> entry : sessionPools.entrySet()) {
try {
entry.getValue().stream().forEach(item->{
try {
item.sendMessage(textMessage);
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void sendToUser(String uid, String message) {
List<WebSocketSession> socketSession = sessionPools.get(Integer.parseInt(uid));
if (CollectionUtils.isEmpty(socketSession)) {
return;
}
TextMessage textMessage = new TextMessage(message);
socketSession.stream().forEach(item->{
try {
item.sendMessage(textMessage);
} catch (IOException e) {
e.printStackTrace();
}
});
}
public void sendOrderCreate(NewOrderGoods newOrderGoods) {
WebSocketResponse response = new WebSocketResponse(WebSocketConstant.ORDER_CREATE,newOrderGoods);
sendTopic(JSON.toJSONString(response));
}
public void sendOrderRefund(NewOrderGoods newOrderGoods) {
WebSocketResponse response = new WebSocketResponse(WebSocketConstant.ORDER_REFUND,newOrderGoods);
sendTopic(JSON.toJSONString(response));
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class WebSocketResponse {
String action;
Object data;
}
public interface WebSocketConstant {
String CONNECT_SUCCESS = "connect_success";
String ORDER_CREATE = "order_create";
String ORDER_REFUND = "order_refund";
}