【问题标题】:Close the Websocket connection using STOMP使用 STOMP 关闭 Websocket 连接
【发布时间】:2021-03-23 16:59:54
【问题描述】:

目前,我有一个以 Websocket 和 Stomp 作为消息传递子协议的项目,我需要管理 Websocket 上的断开连接事件和重新连接事件。 如果服务器和客户端之间没有消息,我的最终目标是在 5 秒后关闭与 STOMP 的 WebSocket 会话。在服务器和客户端中设置时,我对心跳值感到非常困惑。例如,我在客户端中设置了这些心跳值(使用Stomp.js):

stompClient.heartbeat.outgoing = 5000;
stompClient.heartbeat.incoming = 1000;

这是我在服务器端(Spring Boot)上的心跳值:

config.enableSimpleBroker("/topic")
                .setTaskScheduler(taskScheduler()).setHeartbeatValue(new long[]{5000, 5000});

所以我在服务器端设置了这个值,它会每 5 秒发送一条 PONG 消息,但在客户端,它希望在 1 秒内收到消息,但是当它等待超过一秒时,连接仍然存在,WebSocket 仍在工作。

如果我改变一侧的一个值,它会如何影响另一侧?以及如何使用这些心跳值断言连接将在特定时间关闭?非常感谢。

【问题讨论】:

    标签: java spring-boot websocket stomp stompjs


    【解决方案1】:

    STOMP specification 解释了心跳的工作原理。在创建连接时,客户端和代理之间会达成一项协议,其中将使用 最大 心跳值。

    heart-beat 标头提供了足够的信息,以便各方可以了解是否可以使用心跳、在哪个方向以及以何种频率使用。

    更正式地说,初始帧如下所示:

    CONNECT
    heart-beat:<cx>,<cy>
    
    CONNECTED
    heart-beat:<sx>,<sy>
    

    对于从客户端到服务器的心跳:

    • 如果&lt;cx&gt; 为0(客户端无法发送心跳)或&lt;sy&gt; 为0(服务器不想接收心跳)则没有
    • 否则,每隔MAX(&lt;cx&gt;,&lt;sy&gt;) 毫秒就会有一次心跳

    在另一个方向上,&lt;sx&gt;&lt;cy&gt; 的使用方式相同。

    在您的情况下,客户端指定它希望每 1 秒接收一次心跳,但代理只能每 5 秒发送一次 ping(基于您指定的配置),因此客户端应该只期望每 1 秒发送一次 ping 5 秒(因为 5 > 1)。

    另一个例子...如果您有 cx, cy = 5000, 10000sx, sy = 15000, 20000,客户端将每 20 秒向代理发送一次心跳(即MAX(&lt;cx&gt;,&lt;sy&gt;)),代理将每 15 秒向客户端发送一次心跳秒(即MAX(&lt;sx&gt;,&lt;cy&gt;))。

    另外,请记住,心跳和MESSAGE 帧是两个不同的东西。如果您的客户端没有收到MESSAGE 帧,则连接仍然有效,并且客户端和代理在此期间可以并且仍将交换心跳。

    【讨论】:

    • 例如,服务器和客户端同意心跳值 5000、5000。然后 5 秒后其中一个不发送消息,然后连接将关闭?
    • 例如,如果我有cx, cy = 5000, 10000sx, sy = 15000, 20000,那么两个方向每20秒就会发送一次心跳?
    • 您所说的“消息”到底是什么意思?你说的是心跳还是MESSAGE 帧?
    • 我更新了我的答案以解决您的评论。
    • 这是我对服务器端心跳的配置,我特意设置了至少5秒的时间从服务器发送和检索消息,但是当我查看控制台时我看到来自服务器的消息发送到客户端的速度超过 5 秒,每条发送的消息可能需要 2.5 秒。
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2019-05-08
    • 2019-10-22
    • 2012-08-08
    • 2012-02-21
    相关资源
    最近更新 更多