当前位置: 首页 > 面试题库 >

如何在Java Spring Tomcat中快速关闭无响应的websocket?

左丘繁
2023-03-14
问题内容

我有一个实时应用程序,其中的客户端使用websockets与运行Spring Boot Tomcat的Spring
Framework服务器连接。我希望服务器快速(在5秒内)检测到客户端由于网络断开或其他问题而停止响应的时间,然后关闭websocket。

我努力了

  1. 如文档“配置WebSocket引擎”中所述设置最大会话空闲超时 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html
        @Bean
    public WebSocketHandler clientHandler() {
        return new PerConnectionWebSocketHandler(ClientHandler.class);
    }
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = 
            new ServletServerContainerFactoryBean();
        container.setMaxSessionIdleTimeout(5000);
        container.setAsyncSendTimeout(5000);
        return container;
    }

我不确定此实现是否正确,因为我看不到ServletServerContainerFactoryBean与我的ClientHandlers之间的链接。

  1. 每2.5秒从服务器发送一次ping消息。在通过断开网络连接手动断开客户端连接后,服务器会愉快地发送ping命令30秒钟以上,直到出现传输错误。

  2. 同时1和2

  3. 1和2并server.session-timeout = 5在application.properties中进行设置

我的测试方法是:

  1. 将Websocket从便携式计算机客户端连接到Tomcat服务器
  2. 使用物理交换机关闭笔记本电脑上的网络连接
  3. 等待Tomcat服务器事件

Spring FrameworkTomcat服务器如何快速检测到客户端已断开连接或没有响应以关闭websocket?


问题答案:

我最终采用的方法是实现应用程序层乒乓协议。

  • 服务器向p客户端发送带有周期的ping消息。
  • 客户端以pong消息响应每个ping消息。
  • 如果服务器发送了多个nping消息而未收到pong响应,则它将生成一个超时事件。
  • 如果客户端未及时收到ping消息,则客户端也可以生成超时事件n*p

应该使用更简单的方法在基础TCP连接中使用超时来实现此目的。



 类似资料:
  • 问题内容: 我试图在Swift中声明一个需要可选闭包的参数。我声明的函数如下所示: 但是Swift抱怨说,“条件”中的绑定值必须是一个可选类型,其中声明了“ if let”。 问题答案: 您应该将可选的闭包括在括号中。这将适当地限制操作员的范围。

  • 问题内容: 我正在对服务器进行API调用。我正在利用Alamofire来解决这个问题。我正在尝试创建一个使用Alamofire的GET函数返回基于自定义类的对象的函数,该类包含此GET函数提供的各种输出。 我不清楚执行此操作的方式。 这是我的自定义类,其中包含有关响应的详细信息: 在另一个类中,我具有以下功能: 这将返回,因为在执行之前对服务器的调用未完成。我知道我应该能够使用闭包来做到这一点,但

  • 问题内容: 我想在我的Swift应用程序中添加手电筒功能。我该怎么做呢? 问题答案: 更新#1: (没有返回预期值,这或许是因为它已经修改) 更新#2: 对于Swift 2.0 要将闪光灯从打开切换到关闭(不仅像疯猪的回答中那样“打开”),还可以使用以下方法: 我使用嵌套的do-catch块来实现注释中的Awesomeness建议。这样,即使发生故障,也可以将设备正确解锁以进行配置。 更新#3:

  • 问题内容: 有没有办法关闭回应?我可以使用,但实际上并没有关闭套接字。 我要实现的目标:我正在编写一个与网络连接的Java程序,并为此编写了一个node.js服务器。Java代码: 但是,这只是一直挂着。没有端连接,仍在等待来自套接字的输入。 节点: 但是,它不会关闭连接。如前所述,java一直认为下一步会发生什么,因此它陷入了while循环中。 谢谢 问题答案: 通过设置HTTP标头关闭连接而不

  • 问题内容: 我正在通过ASP.NET Core / Web API / Angular 2上的WintellectNOW课程进行学习。我已经实现了API部分,但是由于某种原因,返回的JSON的变量名都是小写的。 返回的JSON格式如下: 我期待着… 基于…的C#模型 我什至甚至只是为了确定装饰属性而已,仍然没有关系。 在偶然的机会上,它与控制器中的Action和instance变量有关。 如何关闭

  • 问题内容: 我用nodejs,express和htt-proxy编写了一个小型代理。它适用于提供本地文件,但在代理外部api时失败: 问题是yahoo api没有响应,也许有响应,但我没有出现在浏览器中。 问题答案: 和-Package 甚至更简单 它将整个请求传递给API,并将响应传递回请求者。这也处理POST / PUT / DELETE和所有其他请求\ o / 如果您还关心查询字符串,则也应

  • null 但是,当与HTTP1建立连接时,最后调用。 http1ExchangeCodeC.FixedLengthSource::Close 然后,方法读取所有响应体源,如下所示。

  • 如何在Android快速网络库中处理一个空的响应体?我知道在改造中我们有空的,但是如何在快速网络中处理。 POST请求,请求内容类型JSON,用Http代码清空响应体。 改造当量: 我的代码在下面