2845ee8d6055e35d62b88178a33349c6fd57d45f.svn-base 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package cn.com.goldenwater.dcproj.socket;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  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. /**
  11. * <p>
  12. * webSocket 服务
  13. * </p>
  14. *
  15. * @author luneyq
  16. * @author liyz
  17. * @date 2019/4/16 14:32
  18. */
  19. @ServerEndpoint("/websocket/{sid}")
  20. @Component
  21. public class WebSocketServer {
  22. private static Logger logger = LoggerFactory.getLogger(WebSocketServer.class);
  23. /**
  24. * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
  25. */
  26. private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
  27. /**
  28. * 与某个客户端的连接会话,需要通过它来给客户端发送数据
  29. */
  30. private Session session;
  31. /**
  32. * 接收sid
  33. */
  34. private String sid = "";
  35. /**
  36. * 连接建立成功调用的方法
  37. */
  38. @OnOpen
  39. public void onOpen(Session session, @PathParam("sid") String sid) {
  40. this.session = session;
  41. this.sid = sid;
  42. // 加入set中
  43. webSocketSet.add(this);
  44. logger.info("建立连接:{}", sid);
  45. // try {
  46. // sendMessage("连接成功");
  47. // } catch (IOException e) {
  48. // logger.error("websocket IO异常");
  49. // }
  50. }
  51. /**
  52. * 连接关闭调用的方法
  53. */
  54. @OnClose
  55. public void onClose() {
  56. //从set中删除
  57. webSocketSet.remove(this);
  58. logger.info("关闭连接:{}", this.sid);
  59. }
  60. /**
  61. * 收到客户端消息后调用的方法
  62. *
  63. * @param message 客户端发送过来的消息
  64. */
  65. @OnMessage
  66. public void onMessage(String message, Session session) {
  67. logger.debug("onMessage来自{}的消息:{}", sid, message);
  68. // 群发消息
  69. // for (WebSocketServer item : webSocketSet) {
  70. // try {
  71. // item.sendMessage(message);
  72. // } catch (IOException e) {
  73. // e.printStackTrace();
  74. // }
  75. // }
  76. }
  77. /**
  78. * 发生错误时调用的方法
  79. *
  80. * @param session
  81. * @param error
  82. */
  83. @OnError
  84. public void onError(Session session, Throwable error) {
  85. logger.error("发生错误", error.getMessage());
  86. error.printStackTrace();
  87. }
  88. /**
  89. * 实现服务器主动推送
  90. */
  91. public void sendMessage(String message) throws IOException {
  92. this.session.getBasicRemote().sendText(message);
  93. }
  94. /**
  95. * 推送自定义消息(sid为null是群发,sid有值是向指定连接单发)
  96. */
  97. public static void sendInfo(String message, @PathParam("sid") String sid) {
  98. logger.debug("推送给{}的消息:{}", sid, message);
  99. for (WebSocketServer item : webSocketSet) {
  100. try {
  101. // 这里可以设定只推送给这个sid的,为null则全部推送
  102. if (sid == null) {
  103. // item.sendMessage(message);
  104. } else if (item.sid.equals(sid)) {
  105. // 此处只推送单个用户的
  106. item.sendMessage(message);
  107. }
  108. } catch (IOException e) {
  109. continue;
  110. }
  111. }
  112. }
  113. public void onClose(String sid) {
  114. webSocketSet.remove(sid);
  115. }
  116. }