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);
}
}
我是新手 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);
}
}