java - 如何确认客户端收到响应

标签 java servlets jetty

我目前有一个客户端 -> 服务器模型,其中客户端定期推送数据。我在服务器上使用带有 servlet 的 Jersey 来响应传入的请求。

由于这是一个数据同步步骤,一旦服务器接收到数据,就需要向客户端返回一条OK消息。

作为测试,我将服务器处理的路径设置为“/testResponse”,它所做的就是:

@GET
@Path("/testResponse")
@Produces(MediaType.TEXT_PLAIN)
public String GET_testResponse() {

    System.out.println("Received test request...");

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Returning response...");

    return "message received!";

}

我想测试的是我从我的客户端发起请求,但是当客户端等待 5 秒时,客户端退出请求,模拟它与无线断开连接。 5 秒后,服务器返回消息(没有抛出错误)。

我想我的问题很简单:有没有办法让服务器知道客户端是否收到响应,因为没有抛出异常等?当您尝试处理回复?我知道在 Jersey 之外,您可以使用 HttpServletResponse 方法在函数退出之前实际响应,所以我想知道我是否需要类似的东西。

谢谢!

最佳答案

即使客户端完成了 HTTP 请求,服务器也无法知道客户端是否完全处理了响应。出于这个原因,最好设计服务器不需要知道客户端是否收到响应的系统

一种可能的方法是发出请求 idempotent .如果客户端可以确定请求失败,它可以简单地再次尝试相同的请求,无论服务器是否已经处理了请求,结果都是一样的。因此,如果客户端使用的是智能手机,并且在客户端可以处理请求之前电池没电了,那么下次客户端启动时,它可以检查是否有任何未完成的请求要发送,然后重试。

关于java - 如何确认客户端收到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28904003/

相关文章:

java - 无法将 Google Cloud Messaging 集成到 android 库模块中

java - 如何识别 Weblogic Server 的当前版本

java - 使用端口 1099 的 IntelliJ Idea IDE

java - 从 fatjar 运行 jetty

java - 如何将 Jetty 与 Let's Encrypt 证书一起使用?

java - 无法找到或加载主类 HelloWorldApp

java - 我的继承结构有什么问题?

java - 我的 while 循环中的条件似乎不正确?

java - 在同一服务器中的两个 Web 应用程序之间传递对象

jakarta-ee - Jersey 和 Filter 异常处理