一、引入基础的jar。SpringMVC的版本要用4.xxx
1. 本文章用的Spring版本如下:
<properties> <!-- 这里可以加自己的配制信息,也可以覆盖parent中的配制 --> <spring.version>4.3.6.RELEASE</spring.version> </properties>
2. 要添加的必要依赖如下:【其他springmvc自己的依赖请自行添加】
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> <version>8.0.23</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.3.0</version> </dependency>
二、
@Component public class WebSocketHandler extends TextWebSocketHandler { private static final Logger LOG = LoggerFactory.getLogger(WebContext.class); private final static List<WebSocketSession> SESSIONS = Collections .synchronizedList(new ArrayList<WebSocketSession>()); @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { super.afterConnectionEstablished(session); SESSIONS.add(session); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { super.handleTransportError(session, exception); if (session.isOpen()) { session.close(); } SESSIONS.remove(session); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { String userName = (String) session.getAttributes().get(DHWebSocket.SESSION_USER_NAME); try { dispatchMessage(userName, String.valueOf(message.getPayload())); } catch (Exception ignored) { LOG.info("WebSocket 发送失败: " + ignored); } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { super.afterConnectionClosed(session, status); SESSIONS.remove(session); } @Override public boolean supportsPartialMessages() { return false; } private void dispatchMessage(String userName, String message) { sendMessage(userName, new TextMessage("服务器说: " + message)); } boolean sendMessage(String userName, TextMessage message) { if (StringUtils.isEmpty(userName) || message == null) { return false; } for (WebSocketSession session : SESSIONS) { if (!userName.equals(session.getAttributes().get(DHWebSocket.SESSION_USER_NAME).toString())) { continue; } try { if (session.isOpen()) { session.sendMessage(message); } } catch (Exception e) { LOG.info("WebSocket 消息发送失败"); } break; } return true; } }