【问题标题】:HttpServer streaming request body in JavaJava中的HttpServer流式请求主体
【发布时间】:2013-10-11 14:34:43
【问题描述】:

在我读取请求正文之前,所有数据都存储在其中,这对我来说非常有趣。

例如,一个文件正在上传到服务器。 Java 程序接收此文件。如果文件非常大 - 100 GB,则不可能将整个文件内容存储在缓冲区中。

Java 是否从远程计算机流式传输此文件?我的意思是远程计算机发送一小部分数据,Java 接收这部分并等待下一部分。当远程计算机决定服务器读取第一部分数据时,它会发送第二部分数据,依此类推。

Java 及其HttpServer 是否以这种方式工作,还是像 Apache+PHP 那样将整个文件存储在磁盘上?

【问题讨论】:

  • 你说的java和它的HttpServer是什么意思?!您使用的是哪个服务器?顺便说一句,缓冲整个流真的不合逻辑!
  • 嗨,如果我实现 HTTP 服务器,就像主题 stackoverflow.com/questions/3732109/… 中描述的那样。当我收到文件上传请求时,这在低级别是如何工作的。在我阅读整个 t.getRequestBody() 之前,文件内容放在哪里?
  • 它会占用内存,直到 JVM 抛出内存不足异常,你知道,开发人员(你)应该注意这些数据需要如何操作,你会获取输入流并读取数据作为缓冲区,换句话说,如果某些(必需)数据可用,则输入流读取方法不会阻塞线程

标签: java http networking request streaming


【解决方案1】:

您正在寻找的机制是由操作系统的 TCP 堆栈实现的。发送端和接收端都使用缓冲区。

TCP 的工作原理就像接收机器回复发送方“好的,知道了,现在发送下一部分” - 也称为 ACK 数据包。这种机制还可以根据您的连接速度调整传输速度(而不是发送数据太快而导致数据包丢失)。

这是一台运转良好的机器,但如果出现问题,通常会通过 TIMEOUT 来表现。 (在您的示例中,如果您在处理请求正文之前等待很长时间,而不是读取,则发送机器将放弃)。

【讨论】:

  • 发送机器会阻塞,而不是直接放弃。
  • @EJP 两种情况都可能发生,这两种情况都不会涉及相当长的阻塞时间:A) 如果客户端只是拔掉网线,服务器将不会收到任何 ACK,并且SO_SNDBUF 将很快满(例如立即)。此时操作系统(TCP 堆栈)将断开连接。 B) 如果客户端应用程序没有读取数据,那么 SO_RCVBUF 将被填满(在客户端)并且客户端会关闭 TCP 通道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2020-03-29
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多