Метод InputStream.read вызывается слишком быстро - PullRequest
2 голосов
/ 23 сентября 2011

Я пытаюсь прочитать данные InputStream из разъема Bluetooth, и метод делает то, что предполагает делать в начале.Но по какой-то причине позже он не читает все.

Вот метод, который я сейчас использую:

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

Когда я проверяю массив байтов, его конечная часть - этоначало следующей части данных.Это означает, что метод read был вызван еще до того, как он закончил чтение.Кто-нибудь знает, как справиться с этой проблемой?

1 Ответ

5 голосов
/ 23 сентября 2011

Вам придется разобраться с этим самим при разработке протокола приложения.

Предполагая, что вы используете Android BluetoothSocket с RFCOMM, Javadoc говорит следующее:

RFCOMM - это ориентированный на соединение потоковый транспорт по Bluetooth.

и

Интерфейс для сокетов Bluetooth аналогичен интерфейсу сокетов TCP:

Хотя это не совсем понятно из этих цитат, подразумевается, что потоки будут вести себя как потоки TCP, а это означает, что в байтах, доставляемых методами read, нет надежно различимых границ сообщений / пакетов / записей. , Если отправитель решает отправить два сообщения вплотную, то получатель обязан получить конец одного сообщения и начало следующего в буфере чтения.

Итак ... если у вас есть протокол приложения, ориентированный на сообщения / пакеты, работающий через сокет, вы должны спроектировать протокол приложения так, чтобы границы сообщений были различимы получателем независимо от того, как мало / много байтов проходит через время. Другими словами, вам нужно использовать количество байтов пакетов, маркеры конца пакета или что-то подобное в вашем протоколе, чтобы получатель мог выяснить, где заканчивается каждый пакет и начинается следующий.

...