2

我先给你一点背景:

我有一个类应该在套接字中写入一些查询,然后读取答案。这是应该从 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();
}

如果返回的结果是 OK,这个方法很好用,但是如果 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 因为流在缓冲区内没有要读取的更多数据,但是要从套接字读取更多数据。

那么,即使 Stream 需要一些时间来缓冲响应并且在期望输入时也不会阻塞,我如何才能使方法足够灵活以读取整个内容?

如果查询成功,我需要获得整个响应并关闭输入,这样它就不会阻塞,如果命令失败并且套接字期待任何输入。

4

0 回答 0