1

我有两个应用程序。通过wifi相互连接。我正在使用 InputStream 读取从服务器应用程序发送的数据。代码是标准一,

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 方法中杀死和重置线程。我正在从服务器应用程序以 JSON 字符串形式发送接近 6kb 的数据。这在 5 次中有 3 次有效。

有时读取会返回 1.5kb 缓冲区,在第二次运行时它会提供其余数据。但与此同时,第一个 1.5 被发送到 JSON 解析器,这给了我错误。我打印了从服务器端写入 outputBuffer 的字节。它将每次写入 6k 字节。我想知道为什么有时 read() 方法在第二次尝试中只读取流的一半和其余部分?

我怎么知道它是读取了全部数据还是只读取了一半?我事先不知道服务器将发送多少字节。(我想出了数字,因为我正在调试代码。6k 以后可能会改变)。

先感谢您。在这个问题上纠结了两天。:(

4

1 回答 1

1

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

您需要一些编程方式来确定消息是否完整。例如,如果它是一个 JSON 对象或数组,你会通过分析你得到的东西来注意到它是否完整。另一种方法是传输消息的长度。

于 2013-10-15T09:34:58.323 回答