从java.net.Socket读取InputStream有时会阻塞

时间:2013-01-22 11:54:26

标签: java bufferedreader java-io

下面是我的方法,我作为参数传入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();
}

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

64,000美元的问题是这个“毫无意义的含糊不清的数据”?

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

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

如果你想坚持尝试将这些数据作为文本读取......这样零字节/字符不会让你感到悲伤,那么你需要从BufferedReader一个字符中读取一次。当你遇到一个零字符(或坏字符)时,你的字符阅读代码可能会纾困。否则,将非坏字符组合成行,如果这是你真正需要的。


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

  

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

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

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

另一方面,你可能正确地做这些事情,而HTTP服务器可能会被打破。