WebsocketEndPoint.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package com.miniframe.websocket;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import java.util.concurrent.ConcurrentHashMap;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.util.StringUtils;
  15. import org.springframework.web.socket.CloseStatus;
  16. import org.springframework.web.socket.TextMessage;
  17. import org.springframework.web.socket.WebSocketMessage;
  18. import org.springframework.web.socket.WebSocketSession;
  19. import org.springframework.web.socket.handler.TextWebSocketHandler;
  20. /**
  21. * 这个类处理来之浏览器(客户端)的WebSocket请求。在这个例子中,我们创建一个叫WebSocketEndPoint的类,并让它集成TextWebsocketHandler类。
  22. * 然后重写父类方法handlerTextMessage(),每当客户端发送信息过来,都会由这个函数接收并处理。
  23. * 当然这里还可以重写其他方法,如afterConnectionEstablished、afterConnectionClosed、handleTransportError
  24. * 等等
  25. *
  26. * @author Administrator
  27. *
  28. */
  29. @Service
  30. public class WebsocketEndPoint extends TextWebSocketHandler {
  31. @Autowired
  32. private final static Map<String, WebSocketSession> userMap = new ConcurrentHashMap<String, WebSocketSession>();
  33. /**
  34. * 关闭websocket时调用该方法
  35. *
  36. * @see org.springframework.web.socket.WebSocketHandler#afterConnectionClosed(org.springframework.web.socket.WebSocketSession,
  37. * org.springframework.web.socket.CloseStatus)
  38. */
  39. @Override
  40. public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
  41. String projectId = this.getProjectId(session);
  42. if (!StringUtils.isEmpty(projectId)) {
  43. userMap.remove(projectId);
  44. System.err.println("该" + projectId + "用户已成功关闭");
  45. } else {
  46. System.err.println("关闭时,获取用户id为空");
  47. }
  48. }
  49. /**
  50. * 建立websocket连接时调用该方法
  51. *
  52. * org.springframework.web.socket.WebSocketHandler#afterConnectionEstablished(org.springframework.web.socket.WebSocketSession)
  53. */
  54. @Override
  55. public void afterConnectionEstablished(WebSocketSession session) throws Exception {
  56. String projectId = this.getProjectId(session);
  57. if (!StringUtils.isEmpty(projectId)) {
  58. userMap.put(projectId, session);
  59. session.sendMessage(new TextMessage("建立服务端连接成功!"));
  60. }
  61. }
  62. /**
  63. * 客户端调用websocket.send时候,会调用该方法,进行数据通信
  64. *
  65. * org.springframework.web.socket.WebSocketHandler#handleMessage(org.springframework.web.socket.WebSocketSession,
  66. * org.springframework.web.socket.WebSocketMessage)
  67. */
  68. @Override
  69. public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
  70. String msg = message.getPayload().toString();
  71. String projectId = this.getProjectId(session);
  72. WebSocketSession sessionk = userMap.get(projectId);
  73. if(sessionk == null || !session.isOpen()){
  74. userMap.put(projectId, session);
  75. }
  76. System.err.println("该" + projectId + "用户发送的消息是:" + msg);
  77. message = new TextMessage("服务端已经接收到消息,msg=" + msg);
  78. session.sendMessage(message);
  79. }
  80. /**
  81. * 传输过程出现异常时,调用该方法
  82. *
  83. * org.springframework.web.socket.WebSocketHandler#handleTransportError(org.springframework.web.socket.WebSocketSession,
  84. * java.lang.Throwable)
  85. */
  86. @Override
  87. public void handleTransportError(WebSocketSession session, Throwable e) throws Exception {
  88. WebSocketMessage<String> message = new TextMessage("异常信息:" + e.getMessage());
  89. session.sendMessage(message);
  90. }
  91. /**
  92. * org.springframework.web.socket.WebSocketHandler#supportsPartialMessages()
  93. */
  94. @Override
  95. public boolean supportsPartialMessages() {
  96. return false;
  97. }
  98. /**
  99. * sendmessagetouser:发给指定用户
  100. *
  101. */
  102. public void sendMessageToUser(String projectId, String contents) {
  103. WebSocketSession session = userMap.get(projectId);
  104. if (session != null && session.isOpen()) {
  105. try {
  106. TextMessage message = new TextMessage(contents);
  107. session.sendMessage(message);
  108. System.out.println("websocket发生 消息");
  109. } catch (IOException e) {
  110. //e.printStackTrace();
  111. }
  112. }
  113. }
  114. /**
  115. * sendMessageToAllUsers:发给所有的用户
  116. *
  117. */
  118. public void sendMessageToAllUsers(String contents) {
  119. Set<String> projectIds = userMap.keySet();
  120. for (String projectId : projectIds) {
  121. this.sendMessageToUser(projectId, contents);
  122. }
  123. }
  124. /**
  125. * getvdioId:获取用户id
  126. *
  127. * @author liuchao
  128. * @param session
  129. * @return
  130. * @since JDK 1.7
  131. */
  132. private String getProjectId(WebSocketSession session) {
  133. try {
  134. String projectId = (String) session.getAttributes().get("currentUser");
  135. return projectId;
  136. } catch (Exception e) {
  137. e.printStackTrace();
  138. }
  139. return null;
  140. }
  141. }