一、引入spring-websocket
依赖 1 2 3 4 <dependency > <groupId > org.springframework</groupId > <artifactId > spring-websocket</artifactId > </dependency >
二、开启websocket支持 1 2 3 4 5 6 7 8 9 10 11 @Configuration public class WebsocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter () { return new ServerEndpointExporter (); } }
三、websocket工具类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 @Slf4j public class WebsocketUtil { private WebsocketUtil () { } public static final Map<String, Session> WEBSOCKET_CLIENT_SESSION_MAP = Maps.newConcurrentMap(); public static void sendMessageToAllClient (String message) { if (WEBSOCKET_CLIENT_SESSION_MAP.isEmpty()) { log.info("当前无连接的客户端, 消息忽略推送." ); return ; } WEBSOCKET_CLIENT_SESSION_MAP.forEach((sessionId, session) -> { try { session.getBasicRemote().sendText(message); } catch (Exception e) { log.error("服务端向客户端[{}]发送消息异常." , sessionId, e); } }); } }
四、websocket服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 @Slf4j @Component @ServerEndpoint("/websocket") public class WebsocketServer { private String sessionId; @OnOpen public void onOpen (Session session) throws IOException { this .sessionId = session.getId(); if (WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.containsKey(this .sessionId)) { WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.remove(this .sessionId).close(); } WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.put(this .sessionId, session); log.info("客户端[{}]建立websocket连接." , this .sessionId); } @OnClose public void onClose (Session session) { if (WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.containsKey(session.getId())) { WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.remove(session.getId()); log.info("客户端[{}]断开websocket连接." , session.getId()); } } @OnMessage public void OnMessage (String message) { log.info("接收到客户端{}发送的消息:[{}]." , this .sessionId, message); } @OnError public void OnError (Session session, Throwable error) { log.error("websocket连接错误," , error); } }
五、测试
推荐使用Chrome插件–Simple Web Socket Client