Java中的HttpServer流式处理请求主体

Java中的HttpServer流式处理请求主体,java,http,networking,request,streaming,Java,Http,Networking,Request,Streaming,对我来说非常有趣的是,在读取请求正文之前,所有数据都存储在哪里 例如,文件正在上载到服务器。Java程序接收该文件。若文件非常大(100 GB),则不可能将整个文件内容存储在缓冲区中 Java是否从远程计算机传输此文件?我的意思是远程计算机发送一小部分数据,Java接收这部分数据并等待下一部分。当远程计算机决定服务器读取第一部分数据时,它会发送第二部分数据,以此类推 Java及其HttpServer是以这种方式工作的,还是像Apache+PHP那样将整个文件存储在磁盘上?您正在寻找的机制是由操作

对我来说非常有趣的是,在读取请求正文之前,所有数据都存储在哪里

例如,文件正在上载到服务器。Java程序接收该文件。若文件非常大(100 GB),则不可能将整个文件内容存储在缓冲区中

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


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

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

TCP的工作原理通常类似于接收机器对发送方的回复,即“好的,明白了,现在发送下一部分”——也称为ACK数据包。此机制还负责将传输速度调整为连接速度(而不是发送数据太快而导致数据包丢失)


这是一台润滑良好的机器,但如果出现问题,通常会出现超时。(在您的示例中,如果您在处理请求正文之前等待了很长时间,而没有阅读,发送机器就会放弃)。

您所说的java及其HttpServer是什么意思?!您使用的是哪台服务器?顺便说一下,缓冲整个流真的是不合逻辑的!您好,如果我实现HTTP服务器,如主题中所述。当我收到文件上传请求时,这在低级别中是如何工作的。在我读取整个t.getRequestBody()之前,文件内容放在哪里?它一直放在内存中,直到JVM抛出内存不足异常,您知道,开发人员(您)应该注意如何处理这些数据,您将获取输入流并读取数据作为缓冲区,换句话说,如果某些(必需的)数据可用,则输入流读取方法不会阻止线程。发送计算机将阻止,而不仅仅是放弃。@EJP可能会发生两件事,这两件事都不涉及大量的阻止时间:A)如果客户端只拔下网线,服务器将不会得到任何ACK,因此SNDBUF将很快满(例如,立即)。此时操作系统(TCP堆栈)将断开连接。B)如果客户端应用程序未读取数据,则_RCVBUF将变满(在客户端),客户端断开TCP通道。