WebSocketService.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package cn.seecoder.fdroidrepository.websocket;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.socket.WebSocketMessage;
  6. import org.springframework.web.socket.WebSocketSession;
  7. import javax.websocket.*;
  8. import javax.websocket.server.PathParam;
  9. import javax.websocket.server.ServerEndpoint;
  10. import java.io.IOException;
  11. import java.util.LinkedList;
  12. import java.util.Queue;
  13. import java.util.concurrent.ConcurrentHashMap;
  14. @Component
  15. @ServerEndpoint("/message/{userId}")
  16. public class WebSocketService {
  17. // 用户连接池存储
  18. private static ConcurrentHashMap<Integer, Session> SESSION_POLL = new ConcurrentHashMap<>();
  19. // 用户历史消息保存,保存未登录时存储的消息
  20. private static ConcurrentHashMap<Integer, Queue<String>> HISTORY_MESSAGE = new ConcurrentHashMap<>();
  21. private static final Logger logger = LoggerFactory.getLogger(WebSocketService.class);
  22. @OnOpen
  23. public void onOpen(Session session, @PathParam("userId") Integer userId) {
  24. if (!SESSION_POLL.contains(userId)) {
  25. SESSION_POLL.put(userId, session);
  26. }
  27. // 历史数据
  28. if (HISTORY_MESSAGE.contains(userId)) {
  29. Queue<String> history = HISTORY_MESSAGE.get(userId);
  30. if (history.size() > 0) {
  31. for (String text : history) {
  32. try {
  33. session.getBasicRemote().sendText(text);
  34. } catch (IOException exception) {
  35. logger.error("发送历史消息失败,userId: {}, message: {}, exception: {}", userId, text, exception.getMessage());
  36. }
  37. }
  38. }
  39. HISTORY_MESSAGE.remove(userId);
  40. }
  41. }
  42. @OnClose
  43. public void onClose(@PathParam("userId") Integer userId) {
  44. SESSION_POLL.remove(userId);
  45. }
  46. @OnMessage
  47. public void onMessage(String message) {
  48. logger.info("WebSocket 收到信息:{}", message);
  49. if (message.indexOf("ToUser:") == 0) {
  50. String targetId = message.substring(message.indexOf("ToUser:") + 7, message.indexOf(";"));
  51. message = message.substring(message.indexOf(";"));
  52. Integer target = Integer.valueOf(targetId);
  53. if (SESSION_POLL.contains(target)) {
  54. try {
  55. SESSION_POLL.get(target).getBasicRemote().sendText(message);
  56. } catch (IOException exception) {
  57. logger.error("发送历史消息失败, message: {}, exception: {}", message, exception.getMessage());
  58. }
  59. } else {
  60. // 用户未登录,加入历史记录列表
  61. if (HISTORY_MESSAGE.contains(target)) {
  62. HISTORY_MESSAGE.get(target).add(message);
  63. } else {
  64. Queue<String> queue = new LinkedList<>();
  65. queue.add(message);
  66. HISTORY_MESSAGE.put(target, queue);
  67. }
  68. }
  69. }
  70. }
  71. @OnError
  72. public void onError(Session session, Throwable error) {
  73. logger.error("WebSocket Server出现错误,{}", error.getMessage());
  74. }
  75. }