zj
2024-03-27 533f1b6ba44f398d1860a95e38589fbc13d60d44
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
package org.example.websocket.server;
 
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
 
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
 
/**
 * @ClassDescription: websocket服务端
 * @JdkVersion: 1.8
 * @Created: 2023/8/31 14:59
 */
@Slf4j
@Component
//@RestController
@ServerEndpoint("/websocket-server")
//@ServerEndpoint("/")
public class WsServer {
 
    private Session session;
    /**
     * 记录在线连接客户端数量
     */
    private static AtomicInteger onlineCount = new AtomicInteger(0);
    /**
     * 存放每个连接进来的客户端对应的websocketServer对象,用于后面群发消息
     */
    private static CopyOnWriteArrayList<WsServer> wsServers = new CopyOnWriteArrayList<>();
 
    /**
     * 服务端与客户端连接成功时执行
     * @param session 会话
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        //接入的客户端+1
        int count = onlineCount.incrementAndGet();
        //集合中存入客户端对象+1
        wsServers.add(this);
        log.info("与客户端连接成功,当前连接的客户端数量为:{}", count);
    }
 
    /**
     * 收到客户端的消息时执行
     * @param message 消息
     * @param session 会话
     */
    @OnMessage
    public void onMessage(String message, Session session){
        log.info("收到来自客户端的消息,客户端地址:{},消息内容:{}", session.getMessageHandlers(), message);
        //业务逻辑,对消息的处理
//        sendMessageToAll("群发消息的内容");
    }
 
    /**
     * 连接发生报错时执行
     * @param session 会话
     * @param throwable 报错
     */
    @OnError
    public void onError(Session session, @NonNull Throwable throwable){
        log.error("连接发生报错");
        throwable.printStackTrace();
    }
 
    /**
     * 连接断开时执行
     */
    @OnClose
    public void onClose(){
        //接入客户端连接数-1
        int count = onlineCount.decrementAndGet();
        //集合中的客户端对象-1
        wsServers.remove(this);
        log.info("服务端断开连接,当前连接的客户端数量为:{}", count);
    }
 
 
    /**
     * 向客户端推送消息
     * @param message 消息
     */
    public void sendMessage(String message){
        this.session.getAsyncRemote().sendText(message);
        log.info("推送消息给客户端:{},消息内容为:{}", this.session.getMessageHandlers(), message);
    }
 
//    @PostMapping("/send2c")
//    public void sendMessage1(@RequestBody String message){
//        this.session.getAsyncRemote().sendText(message);
//        try {
//            this.session.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//        log.info("推送消息给客户端,消息内容为:{}", message);
//    }
 
 
    /**
     * 群发消息
     * @param message 消息
     */
    public void sendMessageToAll(String message){
        CopyOnWriteArrayList<WsServer> ws = wsServers;
        for (WsServer wsServer : ws){
            wsServer.sendMessage(message);
        }
    }
 
    @PostMapping("/send2AllC")
    public void sendMessageToAll1(@RequestBody String message){
        CopyOnWriteArrayList<WsServer> ws = wsServers;
        for (WsServer wsServer : ws){
            wsServer.sendMessage(message);
        }
    }
 
 
}