Передача больших объемов данных через Bluetooth на Android Gingerbread - PullRequest
5 голосов
/ 11 ноября 2011

Я пытаюсь перенести около одного мегабайта произвольных данных одновременно с одного телефона Android на другой.В настоящее время я записываю размер, код команды и данные в DataOutputStream вокруг BufferedOutputStream, вокруг OutputStream, возвращенного из bluetoothSocketInstance.getOutputStream().

. Принимающий телефон читает размер и код команды.и затем читает из входного потока, пока он не получил все ожидаемые данные.Это работает для коротких строк, но для больших файлов не все данные передаются.Запуск приложения в отладчике показывает, что запись возвращается без каких-либо исключений, а чтение считывает часть ожидаемых байтов и затем блокируется на неопределенный срок.Это также не бросает никаких исключений.

Есть ли где-нибудь буфер, который заполняется?Есть ли что-то еще, что мне нужно сделать, чтобы все данные были переданы?

Мой код для отправителя и получателя указан ниже:

Отправитель:

  try {

            DataOutputStream d = new DataOutputStream(new BufferedOutputStream(mmOutStream,buffer.length+8));
            //int b= buffer.length;
            d.writeInt(buffer.length);
            d.writeInt(command);

            d.write(buffer);
            d.flush();

        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }

Получатель:

 try {

                // Read from the InputStream
                int messageSize= inStream.readInt();
                int messageCode = inStream.readInt();
                bytes=0;
                buffer =new byte[messageSize];
                while(bytes < messageSize)
                {
                    bytes += inStream.read(buffer,bytes,messageSize - bytes);

                }
                    message = bytes;
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

После дополнительного тестирования я изменил код отправки так:

for(int i=0; i<buffer.length;i+=BIG_NUM)
            {
                int b = ((i+BIG_NUM) < buffer.length) ? BIG_NUM: buffer.length - i;
                d.write(buffer,i,b);
                d.flush();
            }

Файлы теперь отправлены. У кого-нибудь есть идеи почему? Блокируется ли вызов flush() до тех пор, пока данные не будут фактически переданы? Существует ли какая-либо документация о размере буферов отправки и получения, которая помогла бы мне решить, насколько большим я могу безопасно сделать BIG_NUM?

0 голосов
/ 21 ноября 2011

У меня похожая проблема, при отправке файла отсутствуют некоторые детали.Я пытаюсь BufferedOutputStream, но проблема все еще существует.

Наконец-то я нахожу простое решение:

Вам не нужно отправлять длину буфера, просто разделите отправляющий буфер на байтовый массив (например, [8192]) и на приемной стороне убедитесь, что этобуфер намного больше примерно в 4 или 8 раз, чем буфер отправки.Это сработало для меня, и файл отправлен завершено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...