zoukankan      html  css  js  c++  java
  • java.io.IOException: read failed, socket might closed or timeout, read ret: -1

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

    private BluetoothSocket mSocket;
    <span style="white-space:pre">	</span>private InputStream mInputSream;
    <span style="white-space:pre">	</span>private UUID mUUID = UUID
    <span style="white-space:pre">			</span>.fromString("00001101-0000-1000-8000-00805F9B34FB");
    
    //找到蓝牙设备并推断是否连接上蓝牙,并创建socket
    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    		Set<BluetoothDevice> sets = adapter.getBondedDevices();
    		Iterator<BluetoothDevice> 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错误,

    查了各种资料也没找到解决方法。<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">经过自己多次实验发如今</span>
    mSocket.connect()时候还须要在还有一个子线程中处理才正常连接上接收到指令。也就是例如以下代码:
    <pre name="code" class="java">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的时候还须要再开一个子线程。

    
    

  • 相关阅读:
    bzoj 4566: [Haoi2016]找相同字符
    杜教筛模板
    bzoj 3772 :精神污染 线段树+打标记 or 主席树
    bzoj 3779: 重组病毒
    bzoj 3357: [Usaco2004]等差数列
    bzoj 3551: [ONTAK2010]Peaks加强版
    bzoj 4358: permu 莫队
    线段树分裂合并
    bzoj 3065 带插入区间k小值
    子串 [NOIP2015]
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7147625.html
Copyright © 2011-2022 走看看