为什么使用 Java 套接字永远无法到达输入流的末尾?

2024-01-14

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

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-Lengthheader 指示您应该从流中读取多少数据。基本上它告诉你双换行符后面有多少字节(实际上是双换行符)\r\n) 表示 HTTP 标头的结尾。看W3C http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13欲了解更多信息...

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用 Java 套接字永远无法到达输入流的末尾? 的相关文章

随机推荐