傳輸大量數據的藍牙我試圖在同一時間從一個Android手機傳送有關的任意數據的兆字節到另一個。目前,我寫的大小,指令代碼和數據的DataOutputStream
一個BufferedOutputStream
前後,左右從bluetoothSocketInstance.getOutputStream()
返回OutputStream
。在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);
}
}
接收機:
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本機代碼中的藍牙發送緩衝區爲70 KiB(在我的副本中)。而且,Linux在內部使其翻倍(因爲「內核數據結構」)。然而,這不應該成爲一個問題,因爲'write(3)'應該管理這個。而且,flush可能什麼都不做(因爲寫入似乎是同步的),並且它(flush)不會被覆蓋。 – yingted