Android BluetoothSocket OutputStream无限地写入块

时间:2012-09-10 15:17:52

标签: android sockets bluetooth outputstream

我需要以编程方式将1到100 MB的数据以1024字节的块写入远程蓝牙设备。两者都是Android设备。以下是我的客户端程序中传输数据的示例代码段 -

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(缓冲区)在传输一些数据(比如100 KB)后无限地阻塞。值得一提的是,远程设备未配置为监听数据。对可写入的数据量有任何限制吗?

1 个答案:

答案 0 :(得分:6)

蓝牙套接字在读取和写入的阻塞模式下运行。

如果你填满发送缓冲区,那么.write()唯一能阻止你尝试发送更多数据的东西就是阻止。阻止它的替代方法是返回“操作会阻塞!”错误代码,就像TCP套接字在非阻塞模式下可以做的那样。但蓝牙套接字不提供任何此类非阻塞模式。

您声明远程蓝牙设备未从其插槽读取。在这种情况下,本地发送缓冲区和远程接收缓冲区(每个只有一定的有限大小)最终将填满。此时,您的.write()操作将阻塞,直到远程端从其套接字读取内容。你不能只是继续抽取数兆字节的数据,并期望它只是在某处缓冲它。

您在不同Android平台之间遇到的差异可能取决于相关蓝牙堆栈中可用的不同缓冲区空间量。