【问题标题】:Spring Websocket - How can I detect client disconnectSpring Websocket - 如何检测客户端断开连接
【发布时间】:2016-12-13 18:10:49
【问题描述】:

我是春天的新手

我有这门课:

public class Server extends TextWebSocketHandler implements WebSocketHandler {

    WebSocketSession clientsession;
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) {

        clientsession = session;

    }

我需要在 clientsession 上检测客户端断开连接。 实现 ApplicationListener 但不清楚如何注册监听器? 我需要在我的 web.xml 中这样做吗?

【问题讨论】:

    标签: spring websocket spring-websocket


    【解决方案1】:

    WebSocketHandlerafterConnectionClosed 函数在 websocket 客户端断开连接后调用。您只需要以覆盖handleTextMessage 的方式覆盖它。

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus){
        // your code here
    }
    

    客户端断开连接和服务器事件检测之间可能存在大量延迟。 See details about real-time disconnection detection.

    【讨论】:

    • 具体如何覆盖和注册?
    • @MrD 你不需要注册。连接关闭时,该函数已被调用。用简单的覆盖更新了答案。
    【解决方案2】:

    你需要覆盖 AbstractWebSocketMessageBrokerConfigurer 的 configureClientOutboundChannel 和 configureClientInboundChannel,提供你的拦截器

    另一种方法是使用 ApplicationEvents。

    这里描述了这两种方法: http://www.sergialmar.com/2014/03/detect-websocket-connects-and-disconnects-in-spring-4/

    public class StompConnectEvent implements ApplicationListener<SessionConnectEvent> {
    
    private final Log logger = LogFactory.getLog(StompConnectEvent.class);
    
    public void onApplicationEvent(SessionConnectEvent event) {
        StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
    
        String  company = sha.getNativeHeader("company").get(0);
        logger.debug("Connect event [sessionId: " + sha.getSessionId() +"; company: "+ company + " ]");
    }
    

    }

    希望对您有所帮助。如果我需要解释更多,请告诉我。

    【讨论】:

      【解决方案3】:

      您可以使用侦听器来检测会话何时连接或关闭。 有关听众的更多信息,您可以通过此link.

      如何检测已连接会话的示例:

      @Component
      public class SessionConnectedEventListener implements ApplicationListener<SessionConnectedEvent> {
      
          private IWebSocketSessionService webSocketSessionService;
      
          public SessionConnectedEventListener(IWebSocketSessionService webSocketSessionService) {
              this.webSocketSessionService = webSocketSessionService;
          }
      
          @Override
          public void onApplicationEvent(SessionConnectedEvent event) {
              webSocketSessionService.saveSession(event);
          }
      }
      

      如何检测会话何时断开的示例:

      @Component
      public class SessionDisconnectEventListener implements ApplicationListener<SessionDisconnectEvent> {
      
          private IWebSocketSessionService webSocketSessionService;
      
          public SessionDisconnectEventListener(IWebSocketSessionService webSocketSessionService) {
              this.webSocketSessionService = webSocketSessionService;
          }
      
          @Override
          public void onApplicationEvent(SessionDisconnectEvent event) {
              webSocketSessionService.removeSession(event);
          }
      }
      

      【讨论】:

      • 斯帕西博弗拉基米尔。
      【解决方案4】:

      您可能想要实现的是维护多个会话。像这样的:

      public class Server extends TextWebSocketHandler implements WebSocketHandler {
      
          private List<WebSocketSession> sessions = new ArrayList<>();
      
          @Override 
          public void afterConnectionEstablished(WebSocketSession session) {
              sessions.add(session);
          }
      
          @Override
          public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
              sessions.remove(session);
          }
      
          @Override
          public void handleTextMessage(WebSocketSession session, TextMessage message) {
              // clientsession = session;
              // Send individual or broadcast messages here ...
              session.sendMessage(new TextMessage(textMessage + "!"));
          }
      }
      

      【讨论】:

      • 具体在哪里注入这个实现?
      猜你喜欢
      • 2022-01-03
      • 2017-12-15
      • 2020-01-15
      • 2018-08-28
      • 2014-04-14
      • 2010-11-15
      • 2015-11-14
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多