gpt4 book ai didi

java - 为什么使用 Java 套接字永远不会到达输入流的末尾?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:59:11 25 4
gpt4 key购买 nike

我正在用 Java 编写一个简单的代理。我无法将给定请求的全部读入字节数组。具体来说,在下面的循环中,即使客户端已经发送了它要发送的所有数据(即永远不会到达流的末尾),对“读取”的调用也会阻塞。因为我不能确定是时候开始写输出,直到我阅读了全部输入,所以这造成了一些麻烦。如果我终止与服务器的连接,最终到达流的末尾,一切都会顺利进行(来自客户端的所有数据,在本例中为请求 www.google.com 的 Firefox,已被服务器读取,并且它能够根据需要处理它,尽管显然它不能将任何东西发送回客户端)。

public static void copyStream(InputStream is, OutputStream os) throws IOException
{
int read = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while((read = is.read(buffer, 0, BUFFER_SIZE)) != -1)
{
os.write(buffer, 0, read);
}
return;
}

InputStream直接来自客户端socket(getInputStream(),然后缓冲); OutputStream 是一个 ByteArrayOutputStream。

我做错了什么?

最佳答案

通常在 HTTP 中,Content-Length header 指示您应该从流中读取多少数据。基本上它会告诉您有多少字节跟在指示 HTTP header 结束的双换行符(实际上是双换行符 \r\n)之后。参见 W3C更多信息...

如果没有发送 Content-Length header ,您可以尝试在经过一段时间后没有通过连接发送任何数据来中断读取,尽管这绝对不是可取的。

(我假设您将以某种方式处理您正在读取的数据,否则您可以在读取数据时写出每个字节)

关于java - 为什么使用 Java 套接字永远不会到达输入流的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534964/

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