如何知道从套接字inputStream继续读取是否安全(避免读取块)

时间:2013-11-01 14:52:28

标签: sockets block inputstream

我先给你一点上下文:

我有一个类应该在socket中编写一些查询,然后阅读答案。 这是应该从inputStream中读取的代码:

private String getDataFromInputStream() throws IOException
{
    StringBuilder sb = new StringBuilder();

    InputStream stream = this.socket.getInputStream();

    byte[] buff = new byte[1024];
    int bytesRead = 0;

    while(bytesRead >= 0)
    {
        bytesRead = stream.read(buff);

        if (bytesRead > 0)  sb.append(new String(buff, 0, bytesRead));
    }

    return sb.toString();
}

如果返回的结果没问题,这个方法效果很好,但是如果出于某种原因,InputStream.read一直在等待输入,当然还有块。

所以我将代码更改为此代码:

private String getDataFromInputStream() throws IOException
{
    StringBuilder sb = new StringBuilder();

    InputStream stream = this.socket.getInputStream();

    byte[] buff = new byte[1024];
    int bytesRead = 0;

    while(stream.available() > 0)
    {
        bytesRead = stream.read(buff);

        if (bytesRead > 0)  sb.append(new String(buff, 0, bytesRead));
    }

    return sb.toString();
}

但是这里出现了新问题:第二段代码并未读取整个回复。它只返回完整响应的片段。

我知道available()方法返回0,因为流没有更多的数据要在缓冲区内读取,但是有更多的数据需要从套接字中读取。

那么,即使需要一些时间来缓冲响应,并且在预期输入时也不会阻塞,我怎样才能使方法灵活地读取整个事物呢?

如果查询成功,我需要获取整个响应并关闭输入,以便在命令失败且套接字期望任何输入时不会阻塞。

0 个答案:

没有答案