|
@@ -0,0 +1,103 @@
|
|
|
+package com.ruoyi.bd.socket;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
+
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
+import javax.websocket.*;
|
|
|
+import javax.websocket.server.PathParam;
|
|
|
+import javax.websocket.server.ServerEndpoint;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.bind.annotation.CrossOrigin;
|
|
|
+
|
|
|
+@ServerEndpoint("/ws/video/trace/{client}/{device}")
|
|
|
+@CrossOrigin(origins = "*")
|
|
|
+@Component
|
|
|
+public class UWBVideoTraceSocketServer {
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(UWBVideoTraceSocketServer.class);
|
|
|
+
|
|
|
+ // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
|
|
|
+ private static AtomicInteger onlineNum = new AtomicInteger();
|
|
|
+
|
|
|
+ // concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
|
|
|
+ private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
+ public static final String SESSION_KEY_TEMPLATE = "%s-%s";
|
|
|
+
|
|
|
+ @PostConstruct
|
|
|
+ public void init() {
|
|
|
+ logger.info("WebSocketServer init");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 发送消息
|
|
|
+ public void sendMessage(Session session, String message) throws IOException {
|
|
|
+ if (session != null) {
|
|
|
+ synchronized (session) {
|
|
|
+ logger.info("发送数据:{}", message);
|
|
|
+ session.getBasicRemote().sendText(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 群发消息
|
|
|
+ public void broadcast(String message) {
|
|
|
+ for (Session session : sessionPools.values()) {
|
|
|
+ try {
|
|
|
+ sendMessage(session, message);
|
|
|
+ }
|
|
|
+ catch (Exception e) {
|
|
|
+ logger.info("server get {}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 建立连接成功调用
|
|
|
+ @OnOpen
|
|
|
+ public void onOpen(Session session, @PathParam(value = "client") String client,
|
|
|
+ @PathParam(value = "device") String device) {
|
|
|
+ sessionPools.put(String.format(SESSION_KEY_TEMPLATE, client, device), session);
|
|
|
+ addOnlineCount();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭连接时调用
|
|
|
+ @OnClose
|
|
|
+ public void onClose( @PathParam(value = "client") String client,
|
|
|
+ @PathParam(value = "device") String device) {
|
|
|
+ sessionPools.remove(String.format(SESSION_KEY_TEMPLATE, client, device));
|
|
|
+ subOnlineCount();
|
|
|
+ logger.info("{}断开webSocket连接!当前人数为:{}", device, onlineNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 收到客户端信息后,根据接收人的username把消息推下去或者群发
|
|
|
+ // to=-1群发消息
|
|
|
+ @OnMessage
|
|
|
+ public void onMessage(String message) throws IOException {
|
|
|
+ logger.info("server get {}", message);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 错误时调用
|
|
|
+ @OnError
|
|
|
+ public void onError(Session session, Throwable throwable) {
|
|
|
+ logger.info("server get {}", throwable.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void addOnlineCount() {
|
|
|
+ onlineNum.incrementAndGet();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void subOnlineCount() {
|
|
|
+ onlineNum.decrementAndGet();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static AtomicInteger getOnlineNumber() {
|
|
|
+ return onlineNum;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static ConcurrentHashMap<String, Session> getSessionPools() {
|
|
|
+ return sessionPools;
|
|
|
+ }
|
|
|
+}
|