1.pom需要的包
dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
2.springboot启动需要的配置,注意如果要打包war在tomcat中启动不需要一定要注释掉,不然会报错
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig{ //tomcat启动不需要此bean // @Bean // public ServerEndpointExporter serverEndpointExporter() { // return new ServerEndpointExporter(); // } }
@ServerEndpoint("/ws/{username}") @Component public class WebSocketServer { private Logger logger = LoggerFactory.getLogger(this.getClass()); public static int onlineNumber = 0; private static Map<String, Session> clients = new ConcurrentHashMap<>(); @OnOpen public void onOpen(@PathParam("username") String username, Session session) { try { onlineNumber++; logger.info("现在来连接的客户id:" + session.getId() + "用户名:" + username); logger.info("有新连接加入! 当前在线人数" + onlineNumber); clients.put(username.toLowerCase(), session); sendMessageTo("连接成功", username); } catch (Exception e) { logger.info("连接出现异常"); e.printStackTrace(); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose(Session session) { onlineNumber--; try { for (Map.Entry<String, Session> entry : clients.entrySet()) { String user = entry.getKey(); Session csession = entry.getValue(); if (session.equals(csession)) { clients.remove(user); break; } } logger.info("有连接关闭! 当前在线人数" + onlineNumber); } catch (Exception e) { e.printStackTrace(); } } public static void sendMessageTo(String message, String ToUserName) { try { for (Map.Entry<String, Session> entry : clients.entrySet()) { String user = entry.getKey(); if (ToUserName.equals(user)) { Session csession = entry.getValue(); csession.getAsyncRemote().sendText(message); break; } } } catch (Exception e) { e.printStackTrace(); } }
后台配置完。