package com.ruoyi.system.websocket; import com.ruoyi.common.core.utils.JwtUtils; 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 消息处理 * * @作者 ruoyi */ @Component @ServerEndpoint("/websocket/message/{clientType}/{accessToken}") public class WebSocketServer { private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class); public static int socketMaxOnlineCount = 1000; private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount); @OnOpen public void onOpen(Session session, @PathParam("clientType") Integer clientType, @PathParam("accessToken") String accessToken) throws Exception { boolean semaphoreFlag = false; semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore); if (!semaphoreFlag) { LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount); WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount); session.close(); } else { String userId = JwtUtils.getUserId(accessToken); WebSocketUsers.put(session.getId(), session, clientType, Long.parseLong(userId)); if (clientType == 1) { LOGGER.info("\n 用户端建立连接 - {}", session); WebSocketUsers.sendMessageToUserByText(session, "用户端连接成功"); } else if (clientType == 2) { LOGGER.info("\n 拍卖师端建立连接 - {}", session); WebSocketUsers.sendMessageToUserByText(session, "拍卖师端连接成功"); } LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size()); } } @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("吗", "").replace("PING", "PONG") .replace("ping", "pong"); WebSocketUsers.sendMessageToUserByText(session, msg); } }