gpt4 book ai didi

java - 我如何识别 Java 套接字中的 EOF?

转载 作者:可可西里 更新时间:2023-11-01 16:47:30 26 4
gpt4 key购买 nike

我想识别 Java 套接字中的数据流结束。当我运行下面的代码时,它只是卡住并继续运行(它卡在值 10 处)。

我也想让程序下载二进制文件,但最后一个字节总是不同的,所以我不知道如何停止 while(实用地)。

String host = "example.com";
String path = "/";
Socket connection = new Socket(host, 80);

PrintWriter out = new PrintWriter(connection.getOutputStream());
out.write("GET "+ path +" HTTP/1.1\r\nHost: "+ host +"\r\n\r\n");
out.flush();

int dataBuffer;
while ((dataBuffer = connection.getInputStream().read()) != -1)
System.out.println(dataBuffer);

out.close();

感谢任何提示。

最佳答案

实际上您的代码正确。

在 HTTP 1.0 中,每个连接都是关闭的,因此客户端可以检测到输入何时结束。

在具有持久连接的 HTTP 1.1 中,底层 TCP 连接保持打开状态,因此客户端可以通过以下两种方式之一检测输入何时结束:

1) HTTP 服务器放置一个Content-Length header 来指示响应的大小。客户端可以使用它来了解响应何时被完全阅读。

2) 响应以 Chunked-Encoding 发送,这意味着它以 block 的形式出现,前缀为每个 block 的大小。使用此信息的客户端可以根据服务器接收到的数据 block 构建响应。

您应该使用 HTTP 客户端库,因为实现通用 HTTP 客户端并非易事(我可能会这么说)。

要在您发布的代码中具体说明,您应该遵循上述方法之一。

此外,您应该按行阅读,因为 HTTP 是行终止协议(protocol)。

即类似于:

BufferedReader in =new BufferedReader(new InputStreamReader( Connection.getInputStream() ) );
String s=null;
while ( (s=in.readLine()) != null) {
//Read HTTP header
if (s.isEmpty()) break;//No more headers
}
}

按照 khachik 的建议发送 Connection: close 完成工作(因为连接的关闭有助于检测输入的结束)但是性能会变差,因为对于您启动的每个请求一个新的连接。

这当然取决于你想做什么(不管你是否关心)

关于java - 我如何识别 Java 套接字中的 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7599742/

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