WebSocketServer.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package com.example.demo.util;
  2. import com.example.demo.base.Constants;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Component;
  5. import javax.websocket.*;
  6. import javax.websocket.server.PathParam;
  7. import javax.websocket.server.ServerEndpoint;
  8. import java.io.IOException;
  9. import java.util.concurrent.CopyOnWriteArraySet;
  10. @Slf4j
  11. @Component
  12. @ServerEndpoint("aadad" + "/ws/{sid}")
  13. public class WebSocketServer {
  14. //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  15. private static int onlineCount = 0;
  16. //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
  17. private static CopyOnWriteArraySet<WebSocketServer> webSocketSet
  18. = new CopyOnWriteArraySet<WebSocketServer>();
  19. //与某个客户端的连接会话,需要通过它来给客户端发送数据
  20. private Session session;
  21. //接收sid
  22. private String sid = "";
  23. /**
  24. * 连接建立成功调用的方法
  25. */
  26. @OnOpen
  27. public void onOpen(Session session, @PathParam("sid") String sid) {
  28. this.session = session;
  29. webSocketSet.add(this); //加入set中
  30. addOnlineCount(); //在线数加1
  31. log.info("有新窗口开始监听:" + sid + ",当前在线人数为" + getOnlineCount());
  32. this.sid = sid;
  33. try {
  34. sendMessage(Response.success("连接成功"));
  35. } catch (IOException e) {
  36. log.error("websocket IO异常");
  37. }
  38. }
  39. /**
  40. * 连接关闭调用的方法
  41. */
  42. @OnClose
  43. public void onClose() {
  44. webSocketSet.remove(this); //从set中删除
  45. subOnlineCount(); //在线数减1
  46. log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
  47. }
  48. /**
  49. * 收到客户端消息后调用的方法
  50. *
  51. * @param message 客户端发送过来的消息
  52. */
  53. @OnMessage
  54. public void onMessage(String message, Session session) {
  55. log.info("收到来自窗口" + sid + "的信息:" + message);
  56. //群发消息
  57. for (WebSocketServer item : webSocketSet) {
  58. try {
  59. item.sendMessage(message);
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. }
  65. @OnError
  66. public void onError(Session session, Throwable error) {
  67. log.error("发生错误");
  68. error.printStackTrace();
  69. }
  70. //实现服务器主动推送
  71. public synchronized void sendMessage(String message) throws IOException {
  72. this.session.getBasicRemote().sendText(message);
  73. }
  74. //群发自定义消息
  75. public synchronized static void sendInfo(String message, @PathParam("sid") String sid) {
  76. log.info("推送消息到窗口" + sid + ",推送内容:" + message);
  77. for (WebSocketServer item : webSocketSet) {
  78. try {
  79. //这里可以设定只推送给这个sid的,为null则全部推送
  80. if (sid == null || "null".equals(sid)) {
  81. item.sendMessage(message);
  82. } else if (item.sid.equals(sid)) {
  83. item.sendMessage(message);
  84. }
  85. } catch (IOException e) {
  86. continue;
  87. }
  88. }
  89. }
  90. public static synchronized int getOnlineCount() {
  91. return onlineCount;
  92. }
  93. public static synchronized void addOnlineCount() {
  94. WebSocketServer.onlineCount++;
  95. }
  96. public static synchronized void subOnlineCount() {
  97. WebSocketServer.onlineCount--;
  98. }
  99. }