Spring Websocket - 如何检测客户端断开连接

Spring Websocket - How can I detect client disconnect

我是新手 spring

我有这个 class :

public class Server extends TextWebSocketHandler implements WebSocketHandler {

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

        clientsession = session;

    }

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

您需要覆盖 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 + " ]");
}

}

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

WebSocketHandler afterConnectionClosed 函数在 websocket 客户端断开连接后调用。您只需要以覆盖 handleTextMessage.

的方式覆盖它
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus){
    // your code here
}

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

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

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 + "!"));
    }
}

您可以使用侦听器来检测会话何时连接或关闭。 您可以通过此 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);
    }
}