socket/BluetoothSocket的getInputStream/getOutputstream问题:安卓开发一直闪退
写的代码比较小白 请见谅。。
总的问题描述:(客户端和服务端的接收和发送代码基本相同)
每次选择了一个蓝牙设备,客户端去连接服务端,服务端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);
}
相关推荐
基于STM32的智能健康蓝牙手环项目全解析
在嵌入式与物联网开发中,数据采集与无线传输是两大核心环节。STM32作为主流MCU,凭借丰富外设和成熟生态,常被用于构建可穿戴设备原型。通过I2C接口读取传感器数据,再经UART与蓝牙模块透传,最终在手机端解析展示,构成了典型的端到端数据链路。理解这一流程,不仅有助于掌握传感器滤波、自定义帧协议、串口调试等基础技能,也能为更复杂的物联网应用打下根基。以健康监测智能蓝牙手环为例,基于STM32F103C8T6与HC-05的硬件接线、固件逻辑、APP联调及常见问题被完整拆解,帮助初学者快速复现并扩展。从心率血氧
高校技术转移办公室人员如何高效开展技术需求挖掘工作?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
科技中介服务机构如何提升服务的专业性与用户粘性?.docx
科技中介服务机构如何提升服务的专业性与用户粘性?
高校技术转移办公室人员在组织科研成果展示时,如何提升推介材料的专业性与吸引力?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
三相并网逆变器无功功率扰动+孤岛检测控制算法仿真【参考文献+仿真】
内容概要:本文系统梳理了一套面向电力电子与新能源并网领域的仿真研究资源,聚焦三相并网逆变器的关键控制技术,涵盖无功功率扰动、孤岛检测算法、低电压穿越(LVRT)、中点电位平衡、虚拟同步发电机(VSG)、下垂控制、模型预测控制(MPC)、准PR控制及LCL滤波器设计等核心技术。资源包含多种逆变器拓扑结构(如T型三电平、Z源、ANPC、四桥臂等)的Simulink仿真模型,并结合扫频法进行正负序阻抗建模与稳定性分析,强调通过复现经典科研案例提升实际科研能力,适用于电力系统稳定性、微电网运行与可再生能源并网等方向的研究与验证。; 适合人群:电力电子、电气工程及其自动化、新能源科学与工程等相关专业的高校研究生、科研人员及从事光伏、储能逆变器开发的工程技术人员,需具备MATLAB/Simulink仿真基础和一定的电力系统控制理论知识。; 使用场景及目标:① 掌握三相并网逆变器在孤岛检测、无功调节、不平衡电网等复杂工况下的先进控制策略设计与仿真方法;② 借助提供的仿真模型与参考文献快速搭建科研平台,用于论文复现、课题开发或项目验证;③ 深入理解VSG、MPC、阻抗建模与下垂控制等关键技术的实现机制与工程应用路径。; 阅读建议:建议结合文中提供的网盘链接与公众号“荔枝科研社”获取完整仿真模型与参考资料,按照目录顺序循序渐进学习,注重理论推导与仿真实践相结合,优先复现基础模型再进行参数优化与创新拓展。


