admin
2024-04-09 3d28cc569ff9bdf20ac56598ae4de8e2809d6f35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
package com.ruoyi.framework.websocket;
 
import com.alibaba.fastjson2.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.Semaphore;
 
import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;
 
/**
 * websocket 消息处理
 *
 * @author ruoyi
 */
 
@Component
@ServerEndpoint("/websocket/message")
public class WebSocketServer
{
    /**
     * WebSocketServer 日志控制器
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);
 
    /**
     * 默认最多允许同时在线人数100
     */
    public static int socketMaxOnlineCount = 100;
 
    private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);
 
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) throws Exception
    {
        boolean semaphoreFlag = false;
        // 尝试获取信号量
        semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore);
        if (!semaphoreFlag)
        {
            // 未获取到信号量
            LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount);
            WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount);
            session.close();
        }
        else
        {
            // 添加用户
            WebSocketUsers.put(session.getId(), session);
            LOGGER.info("\n 建立连接 - {}", session);
            LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size());
            WebSocketUsers.sendMessageToUserByText(session, "连接成功");
        }
    }
 
    /**
     * 连接关闭时处理
     */
    @OnClose
    public void onClose(Session session)
    {
        LOGGER.info("\n 关闭连接 - {}", session);
        Set<String> strings = configPageSession.keySet();
        if(strings.size()>0){
            for (String string : strings) {
                List<Session> sessions = configPageSession.get(string);
                Iterator<Session> iterator = sessions.iterator();
                while (iterator.hasNext()){
                    Session next = iterator.next();
                    if(next.equals(session)){
                        iterator.remove();
                    }
                }
            }
        }
        // 移除用户
        WebSocketUsers.remove(session.getId());
        // 获取到信号量则需释放
        SemaphoreUtils.release(socketSemaphore);
    }
 
    /**
     * 抛出异常时处理
     */
    @OnError
    public void onError(Session session, Throwable exception) throws Exception
    {
        if (session.isOpen())
        {
            // 关闭连接
            session.close();
        }
        String sessionId = session.getId();
        LOGGER.info("\n 连接异常 - {}", sessionId);
        LOGGER.info("\n 异常信息 - {}", exception);
        // 移出用户
        WebSocketUsers.remove(sessionId);
        // 获取到信号量则需释放
        SemaphoreUtils.release(socketSemaphore);
    }
 
    private static List<Session> mainPageSession = new ArrayList<>();
    private static Map<String,List<Session>> configPageSession = new HashMap<>();//key: 摄像头id,value:session
    /**
     * 服务器接收到客户端消息时调用的方法
     */
    @OnMessage
    public void onMessage(String message, Session session)
    {
        if (message.startsWith("main")) {
 
                mainPageSession.add(session);
 
        }
 
        if (message.startsWith("config")) {
            String[] configs = message.split(":");
            if (configs.length == 2) {
                List<Session> sessions = configPageSession.get(configs[1]);
                if (sessions == null) {
                    sessions = new ArrayList<>();
                }
                sessions.add(session);
                configPageSession.put(configs[1], sessions);
            }
        }
        String msg = message.replace("你", "我").replace("吗", "");
        WebSocketUsers.sendMessageToUserByText(session, msg);
    }
 
 
 
    public static synchronized void sendPicMessage(String message, String topicId) throws EncodeException, IOException {
//        LOGGER.info("main方法启动参数topicId{}",topicId);
        if(mainPageSession.size()>0){
            Iterator<Session> mainIterator = mainPageSession.iterator();
            while(mainIterator.hasNext()){
                Session session = mainIterator.next();
                if (session != null && session.isOpen()) {
                   /* WebsocketObiect websocketObiect=new WebsocketObiect();
                    websocketObiect.setMessage(message);
                    websocketObiect.setTopicId(topicId);
                    session.getBasicRemote().sendText(JSON.toJSONString(websocketObiect));*/
//                    System.out.println("websocketmain成功发送");
                } else {
                    mainIterator.remove();
                }
            }
        }
 
//        LOGGER.info("config方法启动参数topicId{}",topicId);
        if (topicId != null) {
            List<Session> sessions = configPageSession.get(topicId);
            if(sessions!=null&&sessions.size()>0){
                Iterator<Session> iterator = sessions.iterator();
                while(iterator.hasNext()){
                    Session session = iterator.next();
                    if (session != null && session.isOpen()) {
                        session.getBasicRemote().sendText(message);
//                    System.out.println("websocketconfig成功发送");
                    } else {
                        iterator.remove();
                    }
                }
            }
 
 
        }
    }
}