socket/BluetoothSocket的getInputStream/getOutputstream问题:安卓开发一直闪退

能不能学习 2020-03-31 12:45:50
因为是蓝牙聊天的app。。真机连不上电脑无法调试。。。逐渐崩溃。。
写的代码比较小白 请见谅。。


总的问题描述:(客户端和服务端的接收和发送代码基本相同)
每次选择了一个蓝牙设备,客户端去连接服务端,服务端accept,开启接收流线程,客户端也立马开启接收流线程
希望的是连接之后立马在后端交换数据库信息,用户看不见,交换完数据库数据之后开启消息接收发送
两个接收流启动之后,我再调用 输出数据库 的函数 但是每次都立马闪退 找不到原因 因为完全无法调试= = 应该是我不会调。。。绝望。。

运行思路是:
开启了监听线程AcceptThread
BluetoothServerSocket.accept()等待连接,连接了之后启动 接收流 阻塞接收数据
  //阻塞在这里,等待别的设备连接
socket = mServerSocket.accept();
//setListenState(SERVING);//我是服务器
sockets.add(socket);//加入列表
//out(socket);
connected(socket,false);
re=new receiveThread(socket);
re.start();//接收流
isSuc=true;
if(isSuc)
{
customD.show();//提示框 如果点了确认就会开启write方法 往客户端写本地数据库的所有数据
isSuc=false;
}



提示框确认键的设置
customD.setConfirm("confirm", new CustomDialog.IOnConfirmListener(){

@Override
public void onConfirm(CustomDialog dialog) {
Toast.makeText(mContext, "确认成功!",Toast.LENGTH_SHORT).show();

try {
mAcceptThread.re.DBout();
} catch (IOException e) {
e.printStackTrace();
}

}

});



(安卓开发)
启动的方法输出数据库全部的内容
 public void DBout() throws IOException {

String end="messageEND";
List<TUsers> other_Row = p.findAllLocal();//查询全部的表信息
if (other_Row.size() > 0) {

for (TUsers row : other_Row) {
String t= TtoString(row);//自己写的一个方法 将表的每一行转换成string类型
mOutStream.write(t.getBytes());

}
mOutStream.write(end.getBytes());//结束标志
//mOutStream.flush();
}


}



接收read的线程长这样 re=new receiveThread(socket); re.start();//接收流
   public void run(){
try {
setListenState(SERVING);


byte[] buffer = new byte[MAX_BUFFER_SIZE];
int bytes;


InputStream tmpIn = null;
OutputStream tmpOut = null;

//从连接的Socket中获取读数据和写数据的流接口
try {
// br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
tmpIn = rSocket.getInputStream();
tmpOut = rSocket.getOutputStream();
} catch (IOException e) {
setConnectState(CONNECT_STATE_IDLE);
rSocket = null;
mConnectedThread = null;

return;
}

mInStream = tmpIn;
mOutStream = tmpOut;


//读取数据
while (!mUserCancel) {

//阻塞在这里,用流接口等待读取数据
bytes = mInStream.read(buffer);


if (isFirst) {//接收数据库的信息
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
String t1 = new String(data);
if (t1.equals("messageEND")) {
isFirst = false;
}else{
TUsers te = StoTuser(t1);
p.connected_Insert(te, rSocket.getRemoteDevice().getAddress());
continue;
}

}


//将ConnectionManager的连接状态修改成CONNECT_STATE_CONNECTED
setConnectState(CONNECT_STATE_CONNECTED);

if(dd==1){
msg = "sys:##" + "欢迎" + rSocket.getRemoteDevice().getName() + "进入聊天室,当前聊天室人数为" + (sockets.size() + 1);
sendData(msg.getBytes(StandardCharsets.UTF_8), true);//--------进入聊天室的消息
//setListenState(LISTEN_STATE_IDLE);
dd++;
}


try {//这里接收聊天的消息

//将读取到的数据传递给关注它的组件
if (mConnectionListener != null && bytes > 0) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
byte[] temp;
byte[] temp1;
msg = rSocket.getRemoteDevice().getName() + ":";
temp1 = msg.getBytes();
temp = byteMerger(temp1, data);
//发给除了读者之外的设备
for (int i = 0; i < sockets.size(); i++) {
if (!(rSocket.getRemoteDevice().getAddress().equals(sockets.get(i).getRemoteDevice().getAddress())))
sockets.get(i).getOutputStream().write(temp);
}

mConnectionListener.onReadData(temp);

}
} catch (IOException e) {
//阻塞过程中,如果其它地方调用了mSocket.close(),
//或者对方的连接关闭
//将会进入到这个异常当中
break;
}
}


}catch(Exception e){
e.printStackTrace();
}


setListenState(LISTEN_STATE_LISTENING);
setConnectState(CONNECT_STATE_IDLE);
}//run



上面的都是服务端
客户端的接收是
     try {
bytes = mInStream.read(buffer);

//这里是想先服务端write信息给客户端之后,客户端再write自己的数据库信息
if(dd==1){
DBout();
dd++;
}


if (isFirst) {

byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
String t1 = new String(data);
if (t1.equals("messageEND")) {
isFirst = false;
dd++;
}else {
TUsers te = StoTuser(t1);
p.connected_Insert(te, mSocket.getRemoteDevice().getAddress());
continue;
}

}


//将ConnectionManager的连接状态修改成CONNECT_STATE_CONNECTED
setConnectState(CONNECT_STATE_CONNECTED);


//读取数据


//将读取到的数据传递给关注它的组件
if (mConnectionListener != null && bytes > 0) {

byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
mConnectionListener.onReadData(data);
}
...全文
543 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,529

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧