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

Eli*_*Eli 4 spring websocket spring-websocket

我是春天的新手

我有这个课:

public class Server extends TextWebSocketHandler implements WebSocketHandler {

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

        clientsession = session;

    }
Run Code Online (Sandbox Code Playgroud)

我需要在clientsession上检测到客户端断开连接。实现ApplicationListener,但不清楚如何注册监听器?我需要在我的web.xml中执行此操作吗?

mat*_*ttm 7

Websocket客户端断开连接后,将调用该函数。您只需要以覆盖的方式覆盖它。WebSocketHandler afterConnectionClosedhandleTextMessage

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus){
    // your code here
}
Run Code Online (Sandbox Code Playgroud)

客户端断开连接与服务器事件检测之间可能会有相当大的延迟。查看有关实时断开连接检测的详细信息。


Amr*_*ail 5

您将需要覆盖 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 + " ]");
}
Run Code Online (Sandbox Code Playgroud)

}

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


Vla*_*mir 5

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

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

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)