【问题标题】:WebSocket client disconnect due to network loss doesn't get intercepted by Spring server由于网络丢失而导致的 WebSocket 客户端断开连接不会被 Spring 服务器拦截
【发布时间】:2017-06-13 05:00:04
【问题描述】:

我有一个应用程序,其中客户端使用 websockets 连接到运行 Spring Boot Tomcat 的服务器。 我的问题是服务器是否有办法检测由于网络丢失而导致的客户端断开连接。

谢谢。

【问题讨论】:

    标签: spring-boot spring-websocket


    【解决方案1】:

    我以前搜索过这个,我能找到的解决方案是在服务器和客户端之间实现一个乒乓机制。

    例如,每隔几秒钟就特定主题向客户端发送一条虚拟消息并收到另一个虚拟回复,如果您在配置的时间内没有收到回复,则可以认为客户端已断开连接。

    here所述,

    STOMP 和 Spring 还允许我们设置主题,其中每个 订阅者将收到相同的消息。这将是非常 用于跟踪活跃用户。在 UI 中,每个用户订阅一个 报告哪些用户处于活动状态的主题,在我们的示例中 该主题将每 2 秒产生一条消息。客户将 回复每条包含用户列表的消息 心跳,然后更新发送给其他客户端的消息。 如果客户超过 5 秒没有签到(即错过了两次 心跳),我们认为它们是离线的。这给了我们近乎实时的 可用于聊天的用户的分辨率。用户将出现在 屏幕左侧的框,单击名称将拉 为他们打开一个聊天窗口,并在他们旁边放一个信封的名字 有新消息。

    【讨论】:

    • 不使用STOMP有没有更简单的实现乒乓机制的方法?
    【解决方案2】:

    如果您使用 stomp,请检查 SessionDisconnectEvent。 对于原始 Websocket 连接,您可以使用: WebSocketHandler-->afterConnectionClosed

    【讨论】:

    • 我没有使用 stomp。 WebSocketHandler 的 afterConnectionClosed 方法不会在客户端失去其 Internet 连接时触发。
    • 你检查了吗 -> handleTransportError 方法?
    • handleTransportError 应该被触发,但您应该识别异常。如果是 websocket 断开类型的异常,你可以触发你的事件..
    • handleTransportError 只有在通过 websocket 向断开连接的客户端发送一些消息并且仅在 6-7 分钟后才会触发,因此发送的消息会丢失。您知道为什么handleTransportError 在写入websocket 后会以这样的延迟触发吗?
    • handleTransportError 在发生各种 websocket 连接问题时被调用,而不是等待任何东西。 6-7 分钟太长了,你设置 ServletServerContainerFactoryBean.setMaxSessionIdleTimeout 了吗?顺便说一句,如果 tcp 连接空闲时间超过 Tomcat 或 Proxy Idle 秒,Tomcat 或您的代理可以关闭 websocket 会话。您需要 ping-pong 机制和 websocket 连接丢失控制。
    猜你喜欢
    • 2022-01-06
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2012-03-21
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多