Java BufferedReader.lines().foreach()从不终止

Java BufferedReader.lines().foreach()从不终止,java,java-io,java-8,java-stream,Java,Java Io,Java 8,Java Stream,我正在尝试从Bufferedreader读取HTTP请求,该请求获取Socket.getInputStream()作为输入。但是,当我使用Bufferedreader.lines().foreach()时,它永远不会终止,只会卡住 我的代码(简化): 尝试使用无参数构造函数创建套接字,并使用带有端口和超时参数的方法。这将防止无休止的冻结。您需要阅读有关HTTP 1.1协议的更多信息。请求不会在流结束时终止。如果正在使用分块传输模式,则通过耗尽内容长度头中的字节计数或累积分块的字节计数来终止它们。

我正在尝试从Bufferedreader读取HTTP请求,该请求获取
Socket.getInputStream()
作为输入。但是,当我使用
Bufferedreader.lines().foreach()
时,它永远不会终止,只会卡住

我的代码(简化):


尝试使用无参数构造函数创建套接字,并使用带有端口和超时参数的方法。这将防止无休止的冻结。

您需要阅读有关HTTP 1.1协议的更多信息。请求不会在流结束时终止。如果正在使用分块传输模式,则通过耗尽内容长度头中的字节计数或累积分块的字节计数来终止它们。如果它们在流结束时耗尽,您将永远无法发送响应。

我怀疑它正在阻止等待来自永远不会到来的套接字的数据。OP的代码是连接的服务器端,而不是客户端。+1回答不错。当我第一次阅读这个问题时,我错过了对HTTP的引用。请求不一定有
内容长度
。文件可能只是有空内容。由于问题中的代码似乎读取了请求头,因此值得注意的是,头以第一个空行结束。HTTP/1.1允许通过一个连接发送多个请求。“如果它们在流结束时耗尽,您就永远无法发送响应。”这并不完全正确。Http连接通过TCP连接,当一方发送FIN,另一方确认FIN,但仍在发送数据时,TCP连接可以半终止。在java中,这可以使用
Socket.shutdownOutput
完成。您可能会与同时关闭两个插座的正常插座关闭混淆
Socket socket = new ServerSocket(9090);
Socket newConnection = socket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(newConnection.getInputStream()));
reader.lines().forEach(s -> System.out.println(s));