gpt4 book ai didi

java - HTTP 是否允许服务器在使用所有输入之前开始输出?如果是这样,如何在 Java 中访问这样的服务器?

转载 作者:行者123 更新时间:2023-12-04 09:45:55 25 4
gpt4 key购买 nike

注:这个问题与 Is it acceptable for a server to send a HTTP response before the entire request has been received? 密切相关不同之处在于(1)我没有发送错误,我发送的是 200 OK,以及(2)我同时控制客户端和服务器,所以并不真正关心浏览器支持。

上下文:我正在实现一个用于管理文件的 Java HTTP 客户端和服务器。特别是“上传”查询包含文件路径和文件主体,服务器以文件的数字标识符响应。但是,如果已经上传了具有相同路径的文件,则服务器将简单地使用先前生成的标识符进行响应。

具体:如果我按如下方式编写服务器(sparkjava)

put(url, (req, res) -> {
Item existing = lookForExistingItem(req);
if (existing != null) {
return existing.getId();
}
/* Otherwise, consume input, save, generate id and return that */
});

...然后服务器将响应 id 并在客户端完成发送数据之前关闭连接。如果我按如下方式编写客户端:
final HttpURLConnection connection = (HttpURLConnection) new URL(...).openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
ByteStreams.copy(fileInput, connection.getOutputStream());
final String response = CharStreams.toString(new InputStreamReader(connection.getInputStream()));

然后是 IOExceptioncopy 期间抛出由于关闭的连接而运行。在那之后,我无法访问连接的 InputStream了。

我的问题:我怎样才能使这项工作?如果我更改服务器以消耗整个输入并将其丢弃,它可以工作,但感觉就像在浪费资源(一些正在上传的文件可能是重达数百兆字节的视频)。有没有办法改变客户端代码来处理这种情况?

最佳答案

假设文件足够大并且发出多个请求比传输部分文件消耗的资源少得多,您可以将该调用分解为多个请求。

enum UploadStatus {
INITIALIZED,
STARTED,
UPLOADED,
ERROR
}

我的建议:
  • 有静态图ConcurrentMap<File name string, UploadStatus> (或数据库
    条目),您可以在其中跟踪文件上传状态
  • 创建端点以检查和设置文件状态
  • 客户端首先向上述端点发出请求
  • 如果 map 上存在文件并且其状态不是 UploadStatus.ERROR ,设置文件在 map 上的状态为UploadStatus.INITIALIZED并让客户端(客户端 A)知道它可以上传文件(应该在 synchronized block 上执行此操作)
  • 如果文件存在并且UploadStatus.INITIALIZED ,让该客户端(客户端 B)知道它正在上传。为了用户体验,您可以让客户端 B 轮询文件状态,直到 UploadStatus变成 ERRORUPLOADED然后采取适当的行动。 IE。
  • UploadStatus.ERROR 上重新上传文件
  • UploadStatus.UPLOADED 上显示上传的消息
  • 一旦服务器收到来自客户端 A 的上传实际文件的请求,请保持文件上传状态为最新,以便在出错时其他客户端(例如客户端 B)可以重新上传失败的文件。

  • 在设置正确的文件状态时,对单个同步块(synchronized block)进行文件状态检查和设置对于避免竞争条件很重要。此外,该枚举只是为了解释一般的高级步骤。既然你已经有了 Guava,你可以使用 Guava Cache具有用于存储文件状态的时基驱逐。

    关于java - HTTP 是否允许服务器在使用所有输入之前开始输出?如果是这样,如何在 Java 中访问这样的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62118768/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com