首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.io.IOException:读取失败,套接字可能关闭或超时,在Android5.0.1Lolliop版本上读取ret:-1

java.io.IOException:读取失败,套接字可能关闭或超时,在Android5.0.1Lolliop版本上读取ret:-1
EN

Stack Overflow用户
提问于 2015-03-19 11:43:38
回答 4查看 12.6K关注 0票数 7

我将蓝牙套接字连接到蓝牙设备,并希望从该设备读取字节。

我正确地建立了联系:

代码语言:javascript
复制
 try {
         Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
          temp = (BluetoothSocket) m.invoke(mmDevice, 1);
 } catch (Exception e) {
 }

我正在正确地从蓝牙设备读取字节。

我得到了例外:

java.io.IOException:读取失败,套接字可能关闭或超时,读取ret:-1

由于这个原因,连接中断了,我的设备和蓝牙设备之间的通信也结束了。

这个问题在Android5.0.1棒棒糖上特别出现。

有人能找到解决办法吗?

EN

回答 4

Stack Overflow用户

发布于 2015-05-04 11:07:53

使用createRfcommSocketToServiceRecord而不是createRfcommSocket

createRfcommSocketToServiceRecord使用您传递的UUID,并使用SDP来决定用于连接的无线信道。它还检查服务器是否使用相同的UUID侦听远程端点。以这种方式,这是获得连接的最可靠的方式:它总是使用正确的通道,如果打开连接成功,您知道在另一端的东西可以理解您的协议。

相反,createRfcommSocket只是连接到你告诉它的频道。无法知道远程端点上是否存在任何内容:您只知道设备在那里。另外,你选择广播频道可能是完全不恰当的。这就是为什么这个函数没有在API中发布,而另一个函数是首选的。

createRfcommSocket最初看起来可能更可靠,但这是因为它没有检查另一个端点是否存在侦听器:它忽略了某些错误情况。这也许可以用于实验,但对于生产系统来说是没用的,因为用户通常会忘记在另一个端点上启动服务器,而您的应用程序会以令人困惑的方式失败。

当然,由于createRfcommSocket没有在API中发布,所以你不能保证它在将来的安卓版本中会继续工作。

票数 6
EN

Stack Overflow用户

发布于 2017-04-27 12:30:43

在6.0.1中,我一直面临着同样的问题,我在不同的线程/论坛/博客上读到了这个问题,我知道这是因为一个缺失的退路。您可以通过捕获异常并创建所需的回退来处理它。

更确切地说,BluetoothManager返回一个默认值-1,这是不可接受的状态,因此出现了错误。这将引发一个异常,该异常可以通过替换-1的错误来创建一个回退以解决问题。

以下是帮助我的链接:

https://github.com/don/BluetoothSerial/issues/89

参考资料:IOException: read failed, socket might closed - Bluetooth on Android 4.3

票数 2
EN

Stack Overflow用户

发布于 2015-05-26 19:18:20

我在Lollipop上也有类似的问题(在以前的版本中使用),并将"createRfcommSocket“替换为"createInsecureRfcommSocket”,解决了这个问题。

如果您选择官方API,您可以尝试createInsecureRfcommSocketToServiceRecord,因为createRfcommSocketToServiceRecord也不适合我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29143695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档