我有两个申请。通过wifi连接到彼此。我正在使用InputStream来读取从服务器应用程序发送的数据。 代码是std one,
try {
bytesRead = mmInStream.read(buffer, 0, 6300);//read(buffer);
Logger.d(TAG, "Bytes read from inStream : "+bytesRead);
if (-1 != bytesRead) {
handler.obtainMessage(12, bytesRead, -1, buffer).sendToTarget();
} else {
connectionLost();
}
} catch (Exception e) {
e.printStackTrace();
connectionLost();
}
在connectionLost方法中杀死和重置线程。 我从服务器应用程序发送接近6kb的数据,在JSON字符串中。 这适用于5次中的3次。
有时读取将返回说,1.5kb缓冲区,在第二次运行时,它将提供其余数据。但同时首先将1.5发送到JSON解析器,这给了我错误。 我打印了从服务器端写入outputBuffer的字节。它每次写入6k字节。我想知道为什么在某个时候,read()方法在第二次尝试中只读取了一半的流和其余部分?
我如何知道它是读取了总数据还是仅读取了一半? 我事先不知道服务器将发送多少字节。 (我提出了数字,因为我正在调试代码。之后6k可能会改变。)
提前谢谢你。坚持这个问题两天。 :(
答案 0 :(得分:1)
它按设计工作。当您读取流时,不能保证一次获得所有可用字节。当您第一次阅读时,它们很可能甚至无法使用。
您需要一些编程方法来确定消息是否完整。例如,如果它是JSON对象或数组,您将通过分析所获得的内容来注意它是否完整。另一种方法是传输消息的长度。