package com.jcdm.framework.websocket; import java.util.concurrent.Semaphore; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * websocket 消æ¯å¤„ç† * * @author ruoyi */ @Component @ServerEndpoint("/websocket/message/{userId}") public class WebSocketServer { /** * WebSocketServer 日志控制器 */ private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class); /** * 默认最多å…许åŒæ—¶åœ¨çº¿äººæ•°100 */ public static int socketMaxOnlineCount = 100; private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount); /**接收userId*/ private String userId=""; /** * 连接建立æˆåŠŸè°ƒç”¨çš„方法 */ @OnOpen public void onOpen(Session session, @PathParam("userId") String userId) throws Exception { boolean semaphoreFlag = false; // å°è¯•èŽ·å–ä¿¡å·é‡ semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore); if (!semaphoreFlag) { // 未获å–到信å·é‡ LOGGER.error("\n 当å‰åœ¨çº¿äººæ•°è¶…过é™åˆ¶æ•°- {}", socketMaxOnlineCount); WebSocketUsers.sendMessageToUserByText(session, "当å‰åœ¨çº¿äººæ•°è¶…过é™åˆ¶æ•°ï¼š" + socketMaxOnlineCount); session.close(); } else { // æ·»åŠ ç”¨æˆ· // WebSocketUsers.put(session.getId(), session); WebSocketUsers.put(userId, session); LOGGER.info("\n 建立连接 - {}", session); LOGGER.info("\n 当å‰äººæ•° - {}", WebSocketUsers.getUsers().size()); WebSocketUsers.sendMessageToUserByText(session, "连接æˆåŠŸ"); } } /** * 连接关é—æ—¶å¤„ç† */ @OnClose public void onClose(Session session) { LOGGER.info("\n å…³é—连接 - {}", session); // 移除用户 WebSocketUsers.remove(session.getId()); // 获å–到信å·é‡åˆ™éœ€é‡Šæ”¾ SemaphoreUtils.release(socketSemaphore); } /** * æŠ›å‡ºå¼‚å¸¸æ—¶å¤„ç† */ @OnError public void onError(Session session, Throwable exception) throws Exception { if (session.isOpen()) { // å…³é—连接 session.close(); } String sessionId = session.getId(); LOGGER.info("\n 连接异常 - {}", sessionId); LOGGER.info("\n å¼‚å¸¸ä¿¡æ¯ - {}", exception); // 移出用户 WebSocketUsers.remove(sessionId); // 获å–到信å·é‡åˆ™éœ€é‡Šæ”¾ SemaphoreUtils.release(socketSemaphore); } /** * æœåŠ¡å™¨æŽ¥æ”¶åˆ°å®¢æˆ·ç«¯æ¶ˆæ¯æ—¶è°ƒç”¨çš„方法 */ @OnMessage public void onMessage(String message, Session session) { String msg = message.replace("ä½ ", "我").replace("å—", ""); // WebSocketUsers.sendMessageToUserByText(session, msg); } }