MeetingDeviceWebSocketHandler.java 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package com.usky.meeting.websocket;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.web.socket.CloseStatus;
  5. import org.springframework.web.socket.TextMessage;
  6. import org.springframework.web.socket.WebSocketSession;
  7. import org.springframework.web.socket.handler.TextWebSocketHandler;
  8. import java.io.IOException;
  9. import java.util.Map;
  10. import java.util.concurrent.ConcurrentHashMap;
  11. @Slf4j
  12. //@Component
  13. public class MeetingDeviceWebSocketHandler extends TextWebSocketHandler {
  14. private static final Map<String, WebSocketSession> SESSION_MAP = new ConcurrentHashMap<>();
  15. private static final Map<String, String> SESSION_DEVICE_MAP = new ConcurrentHashMap<>();
  16. @Override
  17. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  18. String sessionId = session.getId();
  19. String deviceCode = (String) session.getAttributes().get("deviceCode");
  20. SESSION_MAP.put(sessionId, session);
  21. if (deviceCode != null) {
  22. SESSION_DEVICE_MAP.put(sessionId, deviceCode);
  23. }
  24. log.info("WebSocket连接已建立, sessionId: {}, deviceCode: {}", sessionId, deviceCode);
  25. }
  26. @Override
  27. protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  28. String payload = message.getPayload();
  29. log.info("收到消息, sessionId: {}, message: {}", session.getId(), payload);
  30. String deviceCode = SESSION_DEVICE_MAP.get(session.getId());
  31. session.sendMessage(new TextMessage("{\"type\":\"ack\",\"deviceCode\":\"" + deviceCode + "\",\"message\":\"消息已收到\"}"));
  32. }
  33. @Override
  34. public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
  35. String sessionId = session.getId();
  36. SESSION_MAP.remove(sessionId);
  37. SESSION_DEVICE_MAP.remove(sessionId);
  38. log.info("WebSocket连接已关闭, sessionId: {}, status: {}", sessionId, status);
  39. }
  40. @Override
  41. public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
  42. log.error("WebSocket传输错误, sessionId: {}", session.getId(), exception);
  43. if (session.isOpen()) {
  44. session.close();
  45. }
  46. }
  47. public static void sendMessage(String sessionId, String message) throws IOException {
  48. WebSocketSession session = SESSION_MAP.get(sessionId);
  49. if (session != null && session.isOpen()) {
  50. session.sendMessage(new TextMessage(message));
  51. }
  52. }
  53. public static boolean isSessionOpen(String sessionId) {
  54. WebSocketSession session = SESSION_MAP.get(sessionId);
  55. return session != null && session.isOpen();
  56. }
  57. public static void removeSession(String sessionId) {
  58. SESSION_MAP.remove(sessionId);
  59. SESSION_DEVICE_MAP.remove(sessionId);
  60. }
  61. public static String getDeviceCodeBySession(String sessionId) {
  62. return SESSION_DEVICE_MAP.get(sessionId);
  63. }
  64. }