私は、一度に1メガバイトの任意のデータをAndroid携帯から別の携帯に転送しようとしています。現在、サイズ、コマンドコード、データをBufferedOutputStream
の周りのDataOutputStream
に、OutputStream
の周りには、bluetoothSocketInstance.getOutputStream()
から返されます。Androidのジンジャーブレッドでブルートゥースで大量のデータを転送する
受信側の電話機は、サイズとコマンドコードを読み取り、入力ストリームから、それが予想しているすべてのデータを取得するまで読み取ります。これは短い文字列では機能しますが、大きなファイルではすべてのデータが転送されるわけではありません。デバッガでアプリケーションを実行すると、書き込みが何の例外もなく返され、読み込みで予想されるバイトの一部が読み込まれ、その後無期限にブロックされます。また、例外をスローしません。
バッファがいっぱいになっていますか?すべてのデータが確実に転送されるようにするために何か必要なことはありますか?
送信者と受信者のための私のコードは以下の通りです:
送信者:
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);
}
}
がReceiver:
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;
}
ブルートゥース送信バッファはBluetoothSocketネイティブコード(私のコピーで)で70KBです。また、Linuxはこれを内部的に2倍にします(「カーネルデータ構造」のため)。しかし、 'write(3)'がこれを管理する必要があるので、これは問題ではありません。また、flushは何もしないかもしれません(書き込みは同期的であると思われるので)、それは上書きされません。 – yingted