WebSocketHandler.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package com.ym.mec.biz.handler;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.ym.mec.biz.dal.dto.WebSocketClientDetail;
  5. import com.ym.mec.biz.dal.dto.WebSocketInfo;
  6. import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
  7. import com.ym.mec.biz.service.SoundSocketService;
  8. import com.ym.mec.biz.service.WebSocketEventHandler;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.apache.poi.ss.formula.functions.T;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.web.socket.*;
  15. import org.springframework.web.socket.handler.AbstractWebSocketHandler;
  16. import java.io.IOException;
  17. import java.util.Date;
  18. import java.util.Map;
  19. import java.util.Objects;
  20. import java.util.concurrent.ConcurrentHashMap;
  21. /**
  22. * @Author Joburgess
  23. * @Date 2021/6/9 0009
  24. */
  25. @Service
  26. public class WebSocketHandler extends AbstractWebSocketHandler {
  27. private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketHandler.class);
  28. /**
  29. * @describe 存储客户端链接
  30. */
  31. public static final Map<String, WebSocketClientDetail> WS_CLIENTS = new ConcurrentHashMap<>();
  32. private static Map<WebsocketTypeEnum, WebSocketEventHandler> appMap = new ConcurrentHashMap<>();
  33. /**
  34. * @describe 注册应用
  35. * @author Joburgess
  36. * @date 2021/8/5 0005
  37. * @param websocketType:
  38. * @param webSocketEventHandler:
  39. * @return boolean
  40. */
  41. public static boolean regist(WebsocketTypeEnum websocketType, WebSocketEventHandler webSocketEventHandler){
  42. if (appMap.containsKey(websocketType)){
  43. return false;
  44. }
  45. appMap.put(websocketType, webSocketEventHandler);
  46. return true;
  47. }
  48. @Override
  49. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  50. String phone = session.getPrincipal().getName().split(":")[1];
  51. if(WS_CLIENTS.containsKey(phone)){
  52. WS_CLIENTS.get(phone).getSession().close();
  53. }
  54. LOGGER.info("{}上线", phone);
  55. WS_CLIENTS.put(phone, new WebSocketClientDetail(session, System.currentTimeMillis()));
  56. appMap.values().forEach(e->e.afterConnectionEstablished(session, phone));
  57. super.afterConnectionEstablished(session);
  58. }
  59. @Override
  60. public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
  61. super.handleMessage(session, message);
  62. }
  63. @Override
  64. protected void handleTextMessage(WebSocketSession session, TextMessage message){
  65. String phone = session.getPrincipal().getName().split(":")[1];
  66. LOGGER.info("{}: {}", phone, message.getPayload());
  67. WebSocketInfo<JSONObject> webSocketInfo = JSON.parseObject(message.getPayload(), WebSocketInfo.class);
  68. if(Objects.isNull(webSocketInfo.getHeader().getType())){
  69. webSocketInfo.getHeader().setType(WebsocketTypeEnum.SOUND_COMPARE);
  70. }
  71. appMap.get(webSocketInfo.getHeader().getType()).receiveTextMessage(session, phone, webSocketInfo);
  72. }
  73. @Override
  74. protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
  75. String phone = session.getPrincipal().getName().split(":")[1];
  76. appMap.values().forEach(e->e.receiveBinaryMessage(session, phone, message));
  77. }
  78. @Override
  79. protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
  80. super.handlePongMessage(session, message);
  81. LOGGER.info("心跳信息:{}", new String(message.getPayload().array(), "utf-8"));
  82. }
  83. @Override
  84. public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
  85. String phone = session.getPrincipal().getName().split(":")[1];
  86. session.close();
  87. LOGGER.info("{}异常: {}", phone, exception);
  88. // appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
  89. // exception.printStackTrace();
  90. // if(!WS_CLIENTS.containsKey(phone)){
  91. // return;
  92. // }
  93. // WS_CLIENTS.remove(phone);
  94. }
  95. @Override
  96. public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
  97. super.afterConnectionClosed(session, status);
  98. String phone = session.getPrincipal().getName().split(":")[1];
  99. LOGGER.info("{}离线: {}s", phone, (System.currentTimeMillis() - WS_CLIENTS.get(phone).getLoginTime())/1000);
  100. appMap.values().forEach(e->e.afterConnectionClosed(session, phone));
  101. session.close();
  102. WS_CLIENTS.remove(phone);
  103. }
  104. @Override
  105. public boolean supportsPartialMessages() {
  106. return super.supportsPartialMessages();
  107. }
  108. /**
  109. * @describe 发送文本消息
  110. * @author Joburgess
  111. * @date 2021/8/23 0023
  112. * @param phone: 接收人手机号
  113. * @param message:
  114. * @return boolean
  115. */
  116. public static <T> boolean sendTextMessage(String phone, T message){
  117. if(!WS_CLIENTS.containsKey(phone)||!WS_CLIENTS.get(phone).getSession().isOpen()){
  118. return false;
  119. }
  120. try {
  121. WS_CLIENTS.get(phone).getSession().sendMessage(new TextMessage(JSON.toJSONString(message)));
  122. } catch (IOException e) {
  123. LOGGER.error("消息发送失败:{}", e);
  124. return false;
  125. }
  126. return true;
  127. }
  128. }