传输大量数据的蓝牙我试图在同一时间从一个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