gpt4 book ai didi

java - InputStream.read 方法被调用得太快

转载 作者:行者123 更新时间:2023-11-30 06:33:58 24 4
gpt4 key购买 nike

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

这是我现在使用的方法:

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

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

最佳答案

您将不得不在您的应用程序协议(protocol)设计中自行处理这个问题。

假设您正在使用带有 RFCOMM 的 Android BluetoothSocket,javadoc 是这样说的:

RFCOMM is a connection-oriented, streaming transport over Bluetooth.

The interface for Bluetooth Sockets is similar to that of TCP sockets:

虽然从这些引述中不是很清楚,但暗示流将表现得像 TCP 流,这意味着 read 传送的字节中没有可靠可辨的消息/数据包/记录边界 方法。如果发送方决定连续发送两条消息,则接收方有责任在读取缓冲区中获取一条消息的结尾和下一条消息的开头。

所以...如果你有一个在套接字上运行的面向消息/数据包的应用程序协议(protocol),你必须设计你的应用程序协议(protocol),以便接收者可以识别消息边界,而不管一次通过多少/多少字节时间。换句话说,您需要在协议(protocol)中使用数据包字节计数、数据包结束标记或其他类似内容,以允许接收方确定每个数据包的结束位置和下一个数据包的开始位置。

关于java - InputStream.read 方法被调用得太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7524721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com