【问题标题】:Android BluetoothSocket OutputStream write blocks infinitelyAndroid BluetoothSocket OutputStream 无限写入阻塞
【发布时间】:2012-09-03 11:51:27
【问题描述】:

我需要以编程方式将 1 到 100 MB 的数据以 1024 字节的块写入远程蓝牙设备。两者都是安卓设备。这是我的客户端程序中用于传输数据的示例代码 sn-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)后会无限阻塞。值得一提的是,远程设备未配置为监听数据。可写入的数据量是否有限制?

【问题讨论】:

  • 你是说对方没有从socket读取数据?
  • 准确地说,服务器未配置为通过流读取数据。

标签: android sockets bluetooth outputstream


【解决方案1】:

蓝牙套接字以阻塞模式进行读写操作。

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

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

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

【讨论】:

  • @Trevor 感谢您提供信息。即使我尝试写入数千字节,我也从未遇到过长时间阻塞问题。我仍然想知道缓冲区大小是多少(使用 Android 2.3.3)。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 2015-04-17
  • 2018-03-13
  • 1970-01-01
  • 2011-02-25
  • 2011-10-09
  • 2012-05-21
  • 2018-03-27
相关资源
最近更新 更多