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

Posted

技术标签:

【中文标题】Spring Websocket - 如何检测客户端断开连接【英文标题】:Spring Websocket - How can I detect client disconnect 【发布时间】: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 中这样做吗?

【问题讨论】:

【参考方案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 + "!"));
    

【讨论】:

具体在哪里注入这个实现?

以上是关于Spring Websocket - 如何检测客户端断开连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring+stomp+sockjs 获得 websocket 响应

如何在 apollo 客户端中检测订阅(websocket)的断开和重新连接

如何在 OpenShift 上检测 WebSocket 连接的远程/客户端 IP 地址

如何使用 STOMP 从 Spring WebSocket 服务器向 WebSocket 客户端发送消息?

如何在WebSocket的服务器侧检测客户端的断开连接

如何使用和自定义 MessageConversion(Spring websocket 客户端)