繁体   English   中英

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

[英]Reading InputStream from java.net.Socket sometimes blocks

以下是我作为参数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();
}

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

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

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

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

如果您想继续尝试以文本形式读取此数据...以使零字节/字符不会引起麻烦,那么您需要一次从BufferedReader读取一个字符。 当您遇到零字符(或坏字符)时,您的字符读取代码可以纾困。 否则,如果实际需要的话,将非坏字符组合成几行。


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

我基本上只是期望正常的响应,例如从HTTP服务器收到200,即OK,在这种特殊情况下,我得到的是这些零字节,什么都没有。

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

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

另一方面,您可能会以正确的方式执行这些操作,并且HTTP服务器可能会损坏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM