123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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;
- }
- }
|