DataInputStream挂起在流的末尾

时间:2015-03-06 13:43:47

标签: java sockets inputstream tcpclient datainputstream

我的Java项目(我是客户端)包括通过TCP套接字连接发送请求和读取响应。在套接字上,我分别创建了一个输出和输入流,用于发送和接收数据。一切正常,除了消息的结尾,即我通过我的DataOutputStream正确发送了我的请求,最终的响应(通过DataInputStream)是可以的,但读取总是在DataInputStream.read方法上挂起60秒。在60秒之后,一切都很棒。有我的方法:

private static int BUFFER_SIZE = 1024;
public void read(DataInputStream inputStream) throws IOException {
    int len;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[BUFFER_SIZE];
    while ((len = inputStream.read(buf, 0, BUFFER_SIZE)) != -1) {
        bos.write(buf, 0, len);
    }
    buf = bos.toByteArray();

    // parse buf
}

我认为它与while loope控制有关

((len = inputStream.read(buf, 0, BUFFER_SIZE)) != -1)

但我无法弄清楚是什么!由于响应没有固定的大小,我不知道何时停止阅读。我已经尝试了一些更改de BUFFER_SIZE的配置,通过 inputStream.available()控制循环,但有时可用值为0且inputStream.read继续读取数据。我真的认为我错过了一些细节,但很难找到它!感谢

1 个答案:

答案 0 :(得分:1)

我认为你是一个解决方案并得出结论,我对问题的处理方法是错误的。我正在阅读整个响应,然后解析结果。错误。解决方案是在我阅读时解析响应。这样我知道我在读什么,我知道什么时候停止阅读(我有一些协议文档) 重要提示是使用

InputStream.readFully(byte[] b, int off, int len)

而不是

InputStream.read(byte[] b, int off, int len)

读取完全的方法会将 len 字节准确读入缓冲区b。这样我们保证完全阅读响应或块,而不仅仅是其中的一部分。我也有一些问题,有时它工作正常,其他时间不好。现在有了readFully很棒。 谢谢Titus,你的提示非常自信。