Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过Websocket在Spring框架中实时检测离线和在线客户端_Java_Spring_Spring Boot_Websocket_Spring Websocket - Fatal编程技术网

Java 通过Websocket在Spring框架中实时检测离线和在线客户端

Java 通过Websocket在Spring框架中实时检测离线和在线客户端,java,spring,spring-boot,websocket,spring-websocket,Java,Spring,Spring Boot,Websocket,Spring Websocket,我正在构建一个类似slack的应用程序。我有很多客户端在web和移动设备上运行。它们通过Stomp连接到websocket。我想实时检测哪个用户在线和离线。websocket服务器在spring framework上运行。 spring接受如下请求。我将心跳传入的和传出的值设置为20000 ms @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements Web

我正在构建一个类似slack的应用程序。我有很多客户端在web和移动设备上运行。它们通过
Stomp
连接到websocket。我想实时检测哪个用户在线和离线。
websocket
服务器在
spring framework
上运行。 spring接受如下请求。我将
心跳
传入的
传出的
值设置为
20000 ms

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig  implements WebSocketMessageBrokerConfigurer {

        private List<StompPrincipal> onlineUsers = new ArrayList<>();

        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {

            registry.addEndpoint("/ws")
                    .setAllowedOrigins("*")
                    .setHandshakeHandler(new CustomHandshakeHandler())
                    .withSockJS();
        }

        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.setApplicationDestinationPrefixes("/ws");
            config.enableSimpleBroker("/ws")
                 .setTaskScheduler(new DefaultManagedTaskScheduler())
                 .setHeartbeatValue(new long[]{20000,20000});
        }
}
正如上面的代码,我可以看到用户在请求
websocket服务器之后添加了
onlineUser
。 但问题是,我无法确定用户在线后是否离线。请您建议我确定这一点。
通过这种方式确定在线和离线用户也是最佳实践吗?如果没有,请等待您的建议。现在非常感谢。

经过更多的搜索,我找到了所描述的解决方案。我实现了
ApplicationListener
并覆盖了下面的方法

@Override
     public void onApplicationEvent(SessionDisconnectEvent event) {

     }
通过这种方式,我可以捕获从websocket连接断开连接的用户。 我仍在等待您的最佳实践建议。

使用会话Id检测用户 SocketJS

this.client = over(new SockJS(environment.SOCKET+'/end'));
this.client.connect({userId:'UserIdHere'}, () => {
});
弹簧靴

@Component
public class WebSocketEventListener {

private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);

@Autowired
private SimpMessageSendingOperations messagingTemplate;

@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {

    StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
    @SuppressWarnings("rawtypes")
    GenericMessage connectHeader = (GenericMessage) stompAccessor
            .getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER); // FIXME find a way to pass the username
                                                                            // to the server
    @SuppressWarnings("unchecked")
    Map<String, List<String>> nativeHeaders = (Map<String, List<String>>) connectHeader.getHeaders()
            .get(SimpMessageHeaderAccessor.NATIVE_HEADERS);

    String login = nativeHeaders.get("userId").get(0);
    String sessionId = stompAccessor.getSessionId();

    logger.info("Chat connection by user <{}> with sessionId <{}>", login, sessionId);

}

@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
    StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
    String sessionId = stompAccessor.getSessionId();
    logger.info("Chat connection by user <{}> with sessionId <{}>", "Nop", sessionId);

}
@组件
公共类WebSocketEventListener{
私有静态最终记录器Logger=LoggerFactory.getLogger(WebSocketEventListener.class);
@自动连线
私有SimpMessageSendingOperations消息模板;
@事件监听器
public void handleWebSocketConnectListener(会话连接事件){
StompHeaderAccessor stompAccessor=StompHeaderAccessor.wrap(event.getMessage());
@抑制警告(“原始类型”)
GenericMessage connectHeader=(GenericMessage)stompAccessor
.getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER);//修复程序找到传递用户名的方法
//到服务器
@抑制警告(“未选中”)
映射nativeHeaders=(映射)connectHeader.getHeaders()
.get(SimpMessageHeaderAccessor.NATIVE_头);
字符串login=nativeHeaders.get(“userId”).get(0);
字符串sessionId=stompAccessor.getSessionId();
logger.info(“用户与sessionId的聊天连接”,登录,sessionId);
}
@事件监听器
public void handleWebSocketDisconnectListener(SessionDisconnectEvent事件){
StompHeaderAccessor stompAccessor=StompHeaderAccessor.wrap(event.getMessage());
字符串sessionId=stompAccessor.getSessionId();
info(“用户与sessionId的聊天连接”,“Nop”,“sessionId”);
}
}

@Component
public class WebSocketEventListener {

private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);

@Autowired
private SimpMessageSendingOperations messagingTemplate;

@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {

    StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
    @SuppressWarnings("rawtypes")
    GenericMessage connectHeader = (GenericMessage) stompAccessor
            .getHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER); // FIXME find a way to pass the username
                                                                            // to the server
    @SuppressWarnings("unchecked")
    Map<String, List<String>> nativeHeaders = (Map<String, List<String>>) connectHeader.getHeaders()
            .get(SimpMessageHeaderAccessor.NATIVE_HEADERS);

    String login = nativeHeaders.get("userId").get(0);
    String sessionId = stompAccessor.getSessionId();

    logger.info("Chat connection by user <{}> with sessionId <{}>", login, sessionId);

}

@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
    StompHeaderAccessor stompAccessor = StompHeaderAccessor.wrap(event.getMessage());
    String sessionId = stompAccessor.getSessionId();
    logger.info("Chat connection by user <{}> with sessionId <{}>", "Nop", sessionId);

}