| | |
| | | |
| | | import javax.websocket.*; |
| | | import javax.websocket.server.ServerEndpoint; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | @Slf4j |
| | | @Component |
| | | @ServerEndpoint(value = "/ws/map/websocket") |
| | | public class MapWebsocket { |
| | | |
| | | private Session session; |
| | | private String sessionId; |
| | | private static final ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>(); |
| | | |
| | | @OnOpen |
| | | public void onOpen(Session session) { |
| | | this.session = session; |
| | | this.sessionId = session.getId(); |
| | | log.info("{} connected", this.sessionId); |
| | | sessions.put(session.getId(), session); |
| | | log.info("Opened new session in instance " + session.getId()); |
| | | } |
| | | |
| | | @OnMessage |
| | | public void onMessage(String message, Session session) { |
| | | log.info("{} sendMsg:{}", this.sessionId, message); |
| | | log.info("Received WebSocket message: {}", message); |
| | | } |
| | | |
| | | @OnClose |
| | | public void onClose(Session session) { |
| | | log.info("{} closed", this.sessionId); |
| | | sessions.remove(session.getId()); |
| | | log.info("Closed WebSocket session: {}", session.getId()); |
| | | } |
| | | |
| | | /** |
| | | * @ Param session |
| | | * @ Param error |
| | | */ |
| | | @OnError |
| | | public void onError(Session session, Throwable error) { |
| | | log.error("发生错误"); |
| | | error.printStackTrace(); |
| | | log.error("Error in WebSocket session: {}", session.getId(), error); |
| | | try { |
| | | session.close(); |
| | | } catch (Exception e) { |
| | | log.error("Error closing session: {}", session.getId(), e); |
| | | } finally { |
| | | sessions.remove(session.getId()); |
| | | } |
| | | } |
| | | |
| | | public static void sendMessage(Session session, String message) { |
| | | if(session.isOpen()){ |
| | | try { |
| | | session.getBasicRemote().sendText(message); |
| | | } catch (Exception e) { |
| | | log.error("Failed to send message to session: {}", session.getId(), e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static void broadcast(String message) { |
| | | sessions.forEach((id, session) -> { |
| | | try { |
| | | session.getBasicRemote().sendText(message); |
| | | } catch (Exception e) { |
| | | log.error("Failed to send message to session: {}", id, e); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | } |