蓝牙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;
}
}
}
}
解决方案 »
- 如何实现类似google地图overlay功能
- 关于Google地图开发app key的问题
- 为什么我用setContentView()来切换SurfaceView会出错?
- android中使用mbstowcs报错und efined reference to `mbstowcs'
- s5pv210平台,加载android系统的怪异问题
- Android UI 设计求助
- 如何从takemove呼叫,改变box2d刚体的x坐标
- Android NDK如何调用汇编
- 关于AndroidTV上使用scrollview的问题
- android studio
- 如何在一个activity中实现多个listview
- android定位
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;
}
}
}
}
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;
}
}
}
}