调用的InputStream.read方法太快了

时间:2011-09-23 05:36:56

标签: java inputstream

我正在尝试从蓝牙套接字读取InputStream数据,并且该方法在开始时执行它想要执行的操作。但由于某些原因,以后它不会读取所有内容。

这是我现在正在使用的方法:

public int read(byte[] b, int off, int len)

当我检查字节数组时,它的结尾部分是下一部分数据的开头。这意味着即使在读完之前也会再次调用read方法。有谁知道如何处理这个问题?

1 个答案:

答案 0 :(得分:5)

您将不得不在应用程序协议设计中自行处理。

假设您使用Android BluetoothSocket与RFCOMM,javadoc说:

  

RFCOMM是一种面向连接,流媒体通过蓝牙传输。

  

蓝牙套接字的接口类似于TCP套接字的接口:

虽然从这些引用中看不清楚,但这意味着流将像TCP流一样运行,这意味着{{1}传递的字节中没有可靠的可识别消息/数据包/记录边界} 方法。如果发送方决定背靠背发送两条消息,那么接收方可能会在读缓冲区中收到一条消息的结束和下一条消息的开始。

所以......如果你有一个在套接字上运行的消息/面向数据包的应用程序协议,你必须设计你的应用程序协议,以便接收器能够识别消息边界,而不管有多少/多个字节来自时间。换句话说,您需要使用数据包字节计数,数据包结束标记或协议中的某些内容,以允许接收方确定每个数据包的结束位置以及下一个数据包的开始位置。