使用STOMP实现浏览器向安卓传数据时真机IP配置导致崩溃问题求助
排查方向与解决方案
1. 优先检查最易触发崩溃的配置问题
- 连接地址缺失端口:你修改后的连接地址仅写了笔记本IP,遗漏了服务端运行的8080端口,正确写法应为
ws://[你的笔记本局域网IP]:8080/im/websocket,端口缺失会直接导致连接失败触发崩溃。 - 安卓高版本明文流量限制:Android 9(API 28)及以上系统默认禁止
http/ws这类未加密的明文流量,你需要在AndroidManifest.xml的<application>标签中添加属性android:usesCleartextTraffic="true"放开限制,本地测试环境可直接使用该配置。 - 缺少必要权限:确认
AndroidManifest.xml中已添加网络相关权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. 网络连通性验证
- 关闭笔记本系统防火墙后再测试,或手动添加8080端口的入站访问规则,避免防火墙拦截手机端的连接请求。
- 先使用手机自带浏览器访问
http://[你的笔记本局域网IP]:8080,确认能正常打开服务端页面后再测试STOMP连接,排除网络层连通问题。
3. 代码异常捕获补全
你当前代码多处缺少异常捕获逻辑,极容易因连接失败、数据格式异常触发崩溃:
- 订阅消息时补全错误处理:
stompClient.topic(Const.broadcastResponse) .subscribe( stompMessage -> { // 原有接收逻辑 }, throwable -> { Log.e(Const.TAG, "订阅失败", throwable); } );
- JSON解析逻辑外层统一包裹try-catch,你当前代码中
new JSONObject(stompMessage.getPayload())未捕获异常,若服务端返回非JSON格式数据会直接崩溃。 - 发送消息的
subscribe()补全错误回调,避免发送失败触发未捕获异常。
4. 连接逻辑优化
- 不要在
stompClient.connect()执行后立即发起订阅,建议在StompUtils的OPENED事件回调中执行订阅操作,避免连接未建立成功就发起请求报错。 - 在
BroadcastActivity的onDestroy生命周期中添加stompClient.disconnect()逻辑,避免页面销毁后无效连接引发内存泄露、重复连接异常。
内容的提问来源于stack exchange,提问作者Joe Tan
相关产品推荐
相关产品推荐

