-1

下面是我作为参数 java.net.Socket:getInputStream() 传入的方法。

这几乎在任何时候都非常有效。

当来自套接字的输入流是一大块空字节(不明确的数据)时,就会出现问题。这使我的程序完全停止响应。有谁知道发生了什么?我不应该得到 IOException 或其他东西,而不仅仅是停止响应吗?如果例如数据是一些无用的模棱两可的信息,我该如何退出读取。

public static String fromStream(InputStream in) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder out = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        out.append(line);
    }
    return out.toString();
}
4

2 回答 2

4

如果流包含 '00' 字节,则使用 readLine() 读取数据可能是错误的。您应该改为读取字节。

于 2013-01-22T12:06:36.000 回答
1

64,000 美元的问题是这个“毫无意义的模糊数据”是什么?

如果它真的毫无意义,那么你应该真正关注它为什么被发送。它很可能是由发送数据的应用程序中的错误引起的。找到并修复它,您无需更改客户端代码。

另一方面,它可能是有意义的数据……但您/您的应用程序不知道它的含义。Reader在这种情况下,根本问题是该文件不是文本文件,因此使用/读取它是不正确的BufferedReader

如果您想坚持尝试将这些数据作为文本读取......以这样一种方式,即零字节/字符不会让您感到悲伤,那么您需要一次读取BufferedReader一个字符。当您遇到零字符(或坏字符)时,您的字符读取代码可以退出。否则,如果这是您真正需要的,请将非坏字符组合成行。


您的评论有几点需要注意:

我基本上只是期待正常的响应,例如包括来自 HTTP 服务器的 200 即 OK,在这种特殊情况下,我得到这些零字节,而没有其他任何东西。

首先,听起来您可能正在尝试使用普通套接字与 HTTP 服务器进行交互。这是一个坏主意。真是个坏主意!您的普通套接字代码可能无法正确解释 Kosher HTTP 服务器发送响应的各种不同方式。(这将解释以下内容......)

其次,HTTP 响应包含一个“内容类型”,它为您提供响应正文中内容的媒体类型。如果您的客户端忽略 Content-type 标头,则您可能会以错误的方式处理响应正文。例如,您可能会得到一个 PDF 文件或一个 TAR 文件,其中肯定包含大量的零字节。

另一方面,您可能以正确的方式做这些事情,而 HTTP 服务器可能会被破坏。

于 2013-01-22T12:33:36.283 回答