package org.springblade.common.handler; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; import okhttp3.WebSocket; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; import java.util.stream.Collectors; @EqualsAndHashCode @Component @ServerEndpoint("/websocket/{code}/{targetCode}/{webType}") @Slf4j public class WebSocketServerService { //当前设备编码 private String code; //被控制的设备编码 private String targetCode; //网页类型(1控制器,2显示器) private String webType; //实例一个session,这个session是websocket的session private Session session; //存放websocket的集合 private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); //前端请求时一个websocket时 @OnOpen public void onOpen(Session session, @PathParam("code") String code,@PathParam("targetCode") String targetCode,@PathParam("webType") String webType) { List collect = webSocketSet.stream() .filter(e -> e.code.equals(code)) .collect(Collectors.toList()); if (collect.size()>0){ log.info("【websocket消息】该设备已连接,无法再次连接,连接的设备id为{},连接类型为{},目标设备为{},当前连接总数为{}",code,webType,targetCode,webSocketSet.size()); // sendErrorMessage("该设备已连接",code); return; } this.session = session; this.code = code; this.targetCode = targetCode; this.webType = webType; webSocketSet.add(this); log.info("【websocket消息】有新的连接,连接的设备id为{},连接类型为{},目标设备为{}, 当前连接总数:{}",code,webType,targetCode, webSocketSet.size()); } //前端关闭时一个websocket时 @OnClose public void onClose(@PathParam("code") String code,@PathParam("targetCode") String targetCode,@PathParam("webType") String webType) { webSocketSet.remove(this); log.info("【websocket消息】设备id为{},类型为{},连接断开, 总数:{}",code,webType, webSocketSet.size()); } //前端向后端发送消息 @OnMessage public void onMessage(String message,@PathParam("code") String code,@PathParam("targetCode") String targetCode,@PathParam("webType") String webType) { log.info("【websocket消息】收到客户端发来的消息:{},发送消息的设备编码为{},设备类型为{},目标设备为{}", message,code,webType,targetCode); sendMessage(message,targetCode); } //新增一个方法用于主动向客户端发送消息 public static void sendMessage(String message,String targetCode) { log.info("【websocket消息】广播消息, message={}", message); for (WebSocketServerService webSocket: webSocketSet) { try { if (webSocket.code.equals(targetCode)){ webSocket.session.getBasicRemote().sendText(message); } } catch (Exception e) { e.printStackTrace(); } } } public static void sendErrorMessage(String message,String code){ for (WebSocketServerService webSocket: webSocketSet) { try { if (webSocket.code.equals(code)){ webSocket.session.getBasicRemote().sendText(message); } } catch (Exception e) { e.printStackTrace(); } } } }