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】:WebSocketHandler
afterConnectionClosed
函数在 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 地址