Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何知道保持从套接字输入流读取是否安全(避免读取块)_Sockets_Block_Inputstream - Fatal编程技术网

Sockets 如何知道保持从套接字输入流读取是否安全(避免读取块)

Sockets 如何知道保持从套接字输入流读取是否安全(避免读取块),sockets,block,inputstream,Sockets,Block,Inputstream,我先给你讲一点背景: 我有一个类,应该在套接字中写一些查询,然后阅读答案。 这里是应该从inputStream读取的代码: private String getDataFromInputStream() throws IOException { StringBuilder sb = new StringBuilder(); InputStream stream = this.socket.getInputStream(); byte[] buff = new byte

我先给你讲一点背景:

我有一个类,应该在套接字中写一些查询,然后阅读答案。 这里是应该从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.read()应该如何知道您知道最终还有更多数据要读取?使用适当的协议。第一个代码块,第二个代码循环,如果没有TCP之上的协议,您将无法对其进行排序。