我需要以编程方式将1到100MB的数据以1024字节的块写入远程蓝牙设备。两者都是安卓设备。以下是我的客户端程序中用于传输数据的示例代码片段–
bTSocket.connect(); //connect to remote BT device
DataOutputStream outStream = new DataOutputStream(bTSocket.getOutputStream());
byte[] buffer = new byte[1024];
int bytesToTransfer = 1000000;
while (bytesToTransfer > 0) {
outStream.write(buffer);
outStream.flush();
bytesToTransfer -= 1024;
}
outStream.close();
当在Android 2.2(Froyo)上运行这段代码时,它运行得很好。然而,在Android 2.3.4和4.0.4的情况下,outStream.write(缓冲区)在传输一些数据(比如100KB)后会无限阻塞。值得一提的是,远程设备没有配置为监听数据。可以写入的数据量有限制吗?
蓝牙插座在阻塞模式下进行读写操作。
如果您填满了发送缓冲区,那么.write()
唯一能阻止您发送更多数据的方法就是阻止。它阻塞的另一种选择是返回一个"操作将阻塞!"错误代码,就像TCP套接字在非阻塞模式下可以做的那样。但是蓝牙插座不提供任何这样的非阻塞模式。
您声明远程蓝牙设备没有从其插槽中读取数据。在这种情况下,本地发送缓冲区和远程接收缓冲区(每个缓冲区只有特定的有限大小)最终将被填满。此时,您的.write()
操作将被阻塞,直到远程端从其套接字中读取一些内容。你不能一直输入兆字节的数据,然后期望它在某个地方缓冲所有数据。
不同Android平台之间的差异可能是由于相关蓝牙堆栈中可用的缓冲空间不同。