Android BluetoothSocket OutputStream无限写入块



我需要以编程方式将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平台之间的差异可能是由于相关蓝牙堆栈中可用的缓冲空间不同。

最新更新