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

本文共 3044 字,大约阅读时间需要 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的时候还须要再开一个子线程。
 

转载地址:http://xagpx.baihongyu.com/

你可能感兴趣的文章
Tomcat9 多端口 多项目
查看>>
cURL: Learning..
查看>>
Codeforces Round #219 (Div. 1) A. Counting Kangaroos is Fun 【二分】
查看>>
Html基础
查看>>
wiki----为用户设置管理员权限
查看>>
Codeforces Round #565 (Div. 3) A. Divide it!
查看>>
《图像处理实例》 之 局部极值提取
查看>>
java 常见几种发送http请求案例[转]
查看>>
更改Visual Studio 2010/2012/2008的主题设置
查看>>
win7系统安装hadoop
查看>>
day5作业购物商城+ATM
查看>>
day6作业--选课系统
查看>>
stegsolve---图片隐写查看器
查看>>
dubbo接口测试
查看>>
Maven生命周期详解(转)
查看>>
uoj#401. 【CTSC2018】青蕈领主(分治FFT)
查看>>
jvm -Xms -Xmx
查看>>
bash的pushd和popd
查看>>
2018 German Collegiate Programming Contest (GCPC 18)
查看>>
前端之jquery
查看>>