1
+ package com .cy .websocket ;
2
+
3
+ import com .cy .data .OnlineCount ;
4
+ import org .springframework .stereotype .Component ;
5
+
6
+ import javax .websocket .*;
7
+ import javax .websocket .server .ServerEndpoint ;
8
+ import java .io .IOException ;
9
+ import java .util .concurrent .CopyOnWriteArraySet ;
10
+
11
+ /**
12
+ * ServerEndpoint注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
13
+ * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
14
+ */
15
+ @ Component
16
+ @ ServerEndpoint ("/chat" )
17
+ public class ChatWebSocket {
18
+
19
+ /**
20
+ * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
21
+ */
22
+ private static CopyOnWriteArraySet <ChatWebSocket > webSocketSet = new CopyOnWriteArraySet <>();
23
+
24
+ /**
25
+ * 与某个客户端的连接会话,需要通过它来给客户端发送数据
26
+ */
27
+ private Session session ;
28
+
29
+ /**
30
+ * 连接建立成功调用的方法
31
+ *
32
+ * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
33
+ */
34
+ @ OnOpen
35
+ public void onOpen (Session session ) {
36
+ this .session = session ;
37
+ webSocketSet .add (this ); //加入set中
38
+ OnlineCount .addOnlineCount (); //在线数加1
39
+ }
40
+
41
+ /**
42
+ * 连接关闭调用的方法
43
+ */
44
+ @ OnClose
45
+ public void onClose () {
46
+ webSocketSet .remove (this ); //从set中删除
47
+ OnlineCount .subOnlineCount (); //在线数减1
48
+ }
49
+
50
+ /**
51
+ * 收到客户端消息后调用的方法
52
+ *
53
+ * @param message 客户端发送过来的消息
54
+ */
55
+ @ OnMessage
56
+ public void onMessage (String message ) {
57
+ //群发消息
58
+ for (ChatWebSocket item : webSocketSet ) {
59
+ try {
60
+ if (item == this ) {
61
+ continue ;
62
+ }
63
+ item .session .getBasicRemote ().sendText (dealMassage (message ));
64
+ } catch (IOException e ) {
65
+ e .printStackTrace ();
66
+ }
67
+ }
68
+ }
69
+
70
+ /**
71
+ * 发生错误时调用
72
+ */
73
+ @ OnError
74
+ public void onError (Throwable error ) {
75
+ error .printStackTrace ();
76
+ }
77
+
78
+ /**
79
+ * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
80
+ * 处理消息
81
+ */
82
+ private String dealMassage (String message ) {
83
+ return message .replaceAll ("<" , "<" ).replaceAll (">" , ">" );
84
+ }
85
+ }
0 commit comments