whyclxw
2025-05-22 2be69300de8d3f96b6c8134094fd11b17d23b0a2
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
package com.whyc.webSocket;
 
import com.whyc.config.WebSocketConfig;
import com.whyc.dto.RealTimeDto;
import com.whyc.dto.Response;
import com.whyc.pojo.db_user.User;
import com.whyc.util.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.servlet.http.HttpSession;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
 
@Component
@ServerEndpoint(value = "/real",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
public class RealTimeSocket {
    private Session session;
 
    private Thread thread;
 
    //private static LockAlarmService almService;
 
 
    private volatile boolean runFlag = true;
 
    private static HttpSession httpSession;
 
    private volatile Map<String, Thread> threadMap = new HashMap<>();
 
    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
 
    /*@Autowired
    public void setLockAlarmService(LockAlarmService almService) {
        LockAlmRtSocket.almService = almService;
    }*/
 
 
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        this.session = session;
        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
    }
    @OnMessage
    public void onMessage(Session session, String message) {
        RealTimeDto realDto= ActionUtil.getGson().fromJson(message,RealTimeDto.class);
        if(httpSession!=null){
            User user = (User) httpSession.getAttribute("user");
            realDto.setUid(user.getId());
        }else{
            realDto.setUid(99);
        }
        thread = new Thread("Thread_realTimeSocket") {
            @Override
            public void run() {
                while (runFlag && !isInterrupted()) {
                    Thread thread = currentThread();
                    threadFlagMap.put(thread.getId(), true);
                    try {
                        Map<String, Object> map=new HashMap<>();
                        //获取头部信息
                        Response topRes=getTop(realDto);
                        map.put("topRes",topRes);
                        //根据pageType获取返回界面
                        Response realRes=getRes(realDto);
                        map.put("realRes",realRes);
                        if (session.isOpen()) {
                            //推送信息
                            synchronized (session) {
                                session.getBasicRemote().sendObject(new Response<>().set(1,map));
                            }
                            threadFlagMap.put(thread.getId(), false);
                        }
                        sleep(4000);
                    } catch (Exception e) {
                        interrupt();
                    }
                }
            }
        };
        thread.start();
        threadFlagMap.put(thread.getId(),true);
        //停止老的socket线程
        Thread threadBefore = threadMap.get(session.getId());
        if(threadBefore !=null && threadBefore.isAlive()){
            while (threadFlagMap.get(threadBefore.getId())){
            }
            threadBefore.interrupt();
        }
        //将线程存储,便于调用定位
        threadMap.put(session.getId(), this.thread);
    }
    //获取头部信息
    private Response getTop(RealTimeDto realDto) {
        return new Response().set(1);
    }
 
    //根据pageType获取返回界面
    private Response getRes(RealTimeDto realDto) {
        Response res=new Response();
        switch (realDto.getPageType()){
            case "system":res=getSystemPage(realDto);break;
            case "power":res=getPowerPage(realDto);break;
            case "vol":res=getVolPage(realDto);break;
            case "res":res=getResPage(realDto);break;
            case "tmp":res=getTmpPage(realDto);break;
            case "img":res=getImgPage(realDto);break;
            case "3D":res=get3DPage(realDto);break;
            case "self":res=getSelfPage(realDto);break;
            case "manage":res=getManagePage(realDto);break;
            default:res=new Response().set(1);
        }
        return res;
    }
    //获取管理界面信息
    private Response getManagePage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取自愈能力界面信息
    private Response getSelfPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取3D界面信息
    private Response get3DPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取图片界面信息
    private Response getImgPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取温度界面信息
    private Response getTmpPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取内阻界面信息
    private Response getResPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取电压界面信息
    private Response getVolPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取电源界面信息
    private Response getPowerPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
    //获取系统概述界面信息
    private Response getSystemPage(RealTimeDto realDto) {
        return new Response().set(1);
    }
 
    @OnClose
    public void onClose(CloseReason closeReason){
        System.err.println("closeReason = " + closeReason);
        runFlag = false;
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
 
    @OnError
    public void onError(Throwable error) {
        error.printStackTrace();
        if (thread != null && thread.isAlive()) {
            thread.interrupt();
        }
        threadMap.remove(session.getId());
    }
}