蓝牙Socket通信,客户端接收的消息顺序打乱了为什么?例如:服务器端发送:123456客户端会收到:34556或者123455什么原因,求指导!// 读取数据
private class readThread extends Thread { public void run() {
BufferedInputStream inStream = null;
byte[] buffer = new byte[1024];
while (true) {
try {
inStream = new BufferedInputStream(socket.getInputStream());
inStream.read(buffer);
String str = new String(buffer);
Message msg = new Message();
msg.obj = str;
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
try {
inStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}
}

解决方案 »

  1.   

    改改:    private class readThread extends Thread {        public void run() {
                BufferedInputStream inStream = null;
                inStream = new BufferedInputStream(socket.getInputStream());
                byte[] buffer = new byte[1024];
                while (true) {
                    try {                    
                        inStream.read(buffer);
                        String str = new String(buffer);
                        Message msg = new Message();
                        msg.obj = str;
                        msg.what = 1;
                        LinkDetectedHandler.sendMessage(msg);
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                        try {
                            inStream.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        break;
                    }
                }
            }
        }
      

  2.   

    我估计是你同时多次调用了readThread这个线程,然后又都Handler过去,导致收到的信息不一致。
      

  3.   

    检查代码中都在哪调用了readThread,你可以发完整的代码上来看看。
      

  4.   

    @Override
    public synchronized void onResume() {
    super.onResume();
    if (Bluetooth.isOpen) {
    Toast.makeText(mContext, "连接已经打开,可以通信。如果要再建立连接,请先断开!",
    Toast.LENGTH_SHORT).show();
    return;
    }
    if (Bluetooth.serviceOrCilent == ServerOrCilent.CILENT) {
    String address = Bluetooth.BlueToothAddress;
    if (!address.equals("null")) {
    device = mBluetoothAdapter.getRemoteDevice(address);
    clientConnectThread = new clientThread();
    clientConnectThread.start();
    Bluetooth.isOpen = true;
    } else {
    Toast.makeText(mContext, "address is null !",
    Toast.LENGTH_SHORT).show();
    }
    } else if (Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE) {
    startServerThread = new ServerThread();
    startServerThread.start();
    Bluetooth.isOpen = true;
    }
    } // 开启客户端
    private class clientThread extends Thread {
    public void run() {
    try {
    // 创建一个Socket连接:只需要服务器在注册时的UUID号
    // socket =
    // device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
    Method m = null;
    m = device.getClass().getMethod("createRfcommSocket",
    new Class[] { int.class });
    socket = (BluetoothSocket) m.invoke(device, 1);
    // socket =
    // device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    // 连接
    Message msg2 = new Message();
    msg2.obj = "请稍候,正在连接服务器:" + Bluetooth.BlueToothAddress;
    msg2.what = 0;
    LinkDetectedHandler.sendMessage(msg2); socket.connect(); Message msg = new Message();
    msg.obj = "已经连接上服务端!可以发送信息。";
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg);
    // 启动接受数据
    mreadThread = new readThread();
    mreadThread.start();
    } catch (IOException e) {
    Log.e("connect", "", e);
    Message msg = new Message();
    msg.obj = "连接服务端异常!断开连接重新试一试。";
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg);
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }; // 开启服务器
    private class ServerThread extends Thread {
    public void run() { try {
    /*
     * 创建一个蓝牙服务器 参数分别:服务器名称、UUID
     */
    mserverSocket = mBluetoothAdapter
    .listenUsingRfcommWithServiceRecord(
    PROTOCOL_SCHEME_RFCOMM,
    UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); Log.d("server", "wait cilent connect..."); Message msg = new Message();
    msg.obj = "请稍候,正在等待客户端的连接...";
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg); /* 接受客户端的连接请求 */
    socket = mserverSocket.accept();
    Log.d("server", "accept success !"); Message msg2 = new Message();
    String info = "客户端已经连接上!可以发送信息。";
    msg2.obj = info;
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg2);
    // 启动接受数据
    mreadThread = new readThread();
    mreadThread.start();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }; /* 停止服务器 */
    private void shutdownServer() {
    new Thread() {
    public void run() {
    if (startServerThread != null) {
    startServerThread.interrupt();
    startServerThread = null;
    }
    if (mreadThread != null) {
    mreadThread.interrupt();
    mreadThread = null;
    }
    try {
    if (socket != null) {
    socket.close();
    socket = null;
    }
    if (mserverSocket != null) {
    mserverSocket.close();/* 关闭服务器 */
    mserverSocket = null;
    }
    } catch (IOException e) {
    Log.e("server", "mserverSocket.close()", e);
    }
    };
    }.start();
    } /* 停止客户端连接 */
    private void shutdownClient() {
    new Thread() {
    public void run() {
    if (clientConnectThread != null) {
    clientConnectThread.interrupt();
    clientConnectThread = null;
    }
    if (mreadThread != null) {
    mreadThread.interrupt();
    mreadThread = null;
    }
    if (socket != null) {
    try {
    socket.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    socket = null;
    }
    };
    }.start();
    } // 发送数据
    private void sendMessageHandle(String msg) {
    if (socket == null) {
    Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show();
    return;
    }
    try {
    OutputStream os = socket.getOutputStream();
    os.write((msg + "\n").getBytes());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    list.add(new deviceListItem(msg + "\n", false));
    mAdapter.notifyDataSetChanged();
    mListView.setSelection(list.size() - 1);
    } // 读取数据
    private class readThread extends Thread {
    public void run() {
    BufferedInputStream inStream = null;
    try {
    inStream = new BufferedInputStream(socket.getInputStream());
    } catch (IOException e2) {
    // TODO Auto-generated catch block
    e2.printStackTrace();
    }
    byte[] buffer = new byte[1024];
    while (true) {
    try {
    inStream.read(buffer);
    String str = new String(buffer);
    Message msg = new Message();
    msg.obj = str;
    msg.what = 1;
    LinkDetectedHandler.sendMessage(msg);
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    try {
    inStream.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    break;
    }
    }
    }
    }