【问题标题】:How to handle socket disconnection and heartbeat messages?如何处理套接字断开和心跳消息?
【发布时间】:2019-09-15 23:15:16
【问题描述】:

我要做什么

我有一个有玩家的大厅,当有人离开大厅时,我想为每个客户端更新它,以便显示实际的玩家列表。

我做了什么

为了避免从前端发送到后端的周期性请求,我决定使用web sockets。当有人离开大厅时,请求被发送到 REST api,然后后端在收到此请求后,执行所有业务逻辑,然后使用套接字“戳”这个大厅,以更新大厅中的所有客户端。

我的问题

一切正常,除了用户关闭浏览器或选项卡的情况,因为在这种情况下我无法发送请求。 (据我所知,使用 javascript 和 beforeunload 事件、onDestroy() 方法等是不可能做到的。)

我的问题

是否可以在服务器端检查是否有任何套接字断开连接,如果是,那么我该怎么做?我还尝试使用从前端发送到后端的heartbeat,但我不知道如何在服务器端处理此heartbeat 消息。

服务器端(春季启动)

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguartion implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/api/socket")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler();
        te.setPoolSize(1);
        te.setThreadNamePrefix("wss-heartbeat-thread-");
        te.initialize();

        config.enableSimpleBroker("/lobby")
                .setHeartbeatValue(new long[]{0, 1000})
                .setTaskScheduler(te);
    }
}


@Controller
public class WebSocketController {

    private final SimpMessagingTemplate template;

    WebSocketController(SimpMessagingTemplate template) {
        this.template = template;
    }

    public void pokeLobby(@DestinationVariable String lobbyName, SocketMessage message) {
        this.template.convertAndSend("/lobby/"+lobbyName.toLowerCase(), message);
    }
}

客户端

  connectToLobbyWebSocket(lobbyName: string): void {
    const ws = new SockJS(this.addressStorage.apiAddress + '/socket');
    this.stompClient = Stomp.over(ws);
    // this.stompClient.debug = null;
    const that = this;
    this.stompClient.connect({}, function () {
      that.stompClient.subscribe('/lobby/' + lobbyName, (message) => {
        if (message.body) {
          that.socketMessage.next(message.body); // do client logic
        }
      });
    });
  }

【问题讨论】:

    标签: java angular spring-boot stomp sockjs


    【解决方案1】:

    您可以在应用程序中侦听SessionDisconnectEvent,并在收到此类事件时向其他客户端发送消息。

    当使用简单消息传递协议(例如 STOMP)作为 WebSocket 子协议的 WebSocket 客户端会话关闭时引发的事件。 请注意,对于单个会话,此事件可能会多次引发,因此事件消费者应该是幂等的并忽略重复事件。

    还有其他类型的events

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      相关资源
      最近更新 更多