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<WebSocketServerService> webSocketSet = new CopyOnWriteArraySet<>();
|
|
//前端请求时一个websocket时
|
@OnOpen
|
public void onOpen(Session session, @PathParam("code") String code,@PathParam("targetCode") String targetCode,@PathParam("webType") String webType) {
|
List<WebSocketServerService> 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();
|
}
|
}
|
}
|
|
|
}
|