我的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继续读取数据。我真的认为我错过了一些细节,但很难找到它!感谢
答案 0 :(得分:1)
我认为你是一个解决方案并得出结论,我对问题的处理方法是错误的。我正在阅读整个响应,然后解析结果。错误。解决方案是在我阅读时解析响应。这样我知道我在读什么,我知道什么时候停止阅读(我有一些协议文档) 重要提示是使用
InputStream.readFully(byte[] b, int off, int len)
而不是
InputStream.read(byte[] b, int off, int len)
读取完全的方法会将 len 字节准确读入缓冲区b。这样我们保证完全阅读响应或块,而不仅仅是其中的一部分。我也有一些问题,有时它工作正常,其他时间不好。现在有了readFully很棒。 谢谢Titus,你的提示非常自信。