调用的InputStream.read方法太快了

Jae*_*Jae 2 java inputstream

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

这是我现在使用的方法:

public int read(byte[] b, int off, int len)
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 5

您将不得不在应用程序协议设计中自行处理此问题.

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

RFCOMM是一种面向连接的蓝牙流媒体传输.

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

虽然从这些引用中不清楚,但暗示流将表现得像TCP流,这意味着在read方法提供的字节中没有可靠的可识别消息/分组/记录边界.如果发送方决定背靠背发送两条消息,则接收方可能会在读缓冲区中收到一条消息的结束和下一条消息的开始.

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