InputStream在多次尝试中读取可用数据

时间:2013-10-15 06:19:39

标签: android wifi inputstream

我有两个申请。通过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可能会改变。)

提前谢谢你。坚持这个问题两天。 :(

1 个答案:

答案 0 :(得分:1)

它按设计工作。当您读取流时,不能保证一次获得所有可用字节。当您第一次阅读时,它们很可能甚至无法使用。

您需要一些编程方法来确定消息是否完整。例如,如果它是JSON对象或数组,您将通过分析所获得的内容来注意它是否完整。另一种方法是传输消息的长度。