6

我需要以编程方式将 1 到 100 MB 的数据以 1024 字节的块写入远程蓝牙设备。两者都是安卓设备。这是我的客户端程序中用于传输数据的示例代码片段 –</p>

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

4

1 回答 1

6

蓝牙套接字以阻塞模式运行,用于读取和写入。

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

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

您在不同 Android 平台之间体验到的差异可能归结为相关蓝牙堆栈中可用的缓冲区空间量不同。

于 2012-09-10T17:30:37.597 回答