博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
阅读量:5239 次
发布时间:2019-06-14

本文共 3098 字,大约阅读时间需要 10 分钟。

近期项目中连接蓝牙之后接收蓝牙设备发出的指令功能,在连接设备之后,创建RfcommSocket连接时候报java.io.IOException: read failed, socket might closed or timeout, read ret: -1错误。以下说一下我的解决方法,希望对各位有一点帮助。

 
private BluetoothSocket mSocket;	private InputStream mInputSream;	private UUID mUUID = UUID			.fromString("00001101-0000-1000-8000-00805F9B34FB");
 
//找到蓝牙设备并推断是否连接上蓝牙,并创建socket
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();		Set
sets = adapter.getBondedDevices(); Iterator
iterator = sets.iterator(); while (iterator.hasNext()) { BluetoothDevice device = iterator.next(); if (mUtils.isConnected(device)) try { mBluetoothDevice = device; mSocket = mBluetoothDevice .createRfcommSocketToServiceRecord(mUUID);

接下来就是socket的连接了,本来我是在一个子线程中做的这些:

public void run() {						try {					if (mSocket != null)						mSocket.connect();					if (mSocket != null) {						mInputSream = mSocket.getInputStream();						mIsRunning = true;					}					while (mIsRunning) {						byte[] buffer = new byte[16];						while (mInputSream != null								&& mInputSream.read(buffer) > 0 && mIsRunning) {							String val = new String(buffer);							Log.i("SPP", val);							Intent intent = new Intent();							if (val.contains("+PTT=P")) {								intent.setAction("android.intent.action.PTT.down");							} else if (val.contains("+PTT=R")) {								intent.setAction("android.intent.action.PTT.up");							}							mContext.sendBroadcast(intent);							Arrays.fill(buffer, (byte) 0);						}					}				} catch (IOException e) {					try {						if (mInputSream != null)							mInputSream.close();						if (mSocket != null) {							mSocket.close();							mSocket = null;						}					} catch (Exception e2) {						// TODO: handle exception					}				}			}
可是这样在socket连接的时候还是会报java.io.IOException: read failed, socket might closed or timeout, read ret: -1错误,

查了各种资料也没找到解决方法。经过自己多次实验发如今
mSocket.connect()时候还须要在还有一个子线程中处理才正常连接上接收到指令。也就是例如以下代码:
public void run() {		new Thread(new Runnable() {			@Override			public void run() {				try {					if (mSocket != null)						mSocket.connect();					if (mSocket != null) {						mInputSream = mSocket.getInputStream();						mIsRunning = true;					}					while (mIsRunning) {						byte[] buffer = new byte[16];						while (mInputSream != null								&& mInputSream.read(buffer) > 0 && mIsRunning) {							String val = new String(buffer);							Log.i("SPP", val);							Intent intent = new Intent();							if (val.contains("+PTT=P")) {								intent.setAction("android.intent.action.PTT.down");							} else if (val.contains("+PTT=R")) {								intent.setAction("android.intent.action.PTT.up");							}							mContext.sendBroadcast(intent);							Arrays.fill(buffer, (byte) 0);						}					}				} catch (IOException e) {					try {						if (mInputSream != null)							mInputSream.close();						if (mSocket != null) {							mSocket.close();							mSocket = null;						}					} catch (Exception e2) {						// TODO: handle exception					}				}			}		}).start();	}
这里仅仅是找到了解决方法,可是还不知道原因,也查了各种资料,没有得到为什么在子线程中做,connect的时候还须要再开一个子线程。
 

转载于:https://www.cnblogs.com/yangykaifa/p/7147625.html

你可能感兴趣的文章
PHPStorm2017设置字体与设置浏览器访问
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>