Kotlin基于WiFi直连实现P2P通信时Socket无法收发数据排查
问题原因及修复方案
- 输出流未主动刷新
所有outputStream.write(msg)执行后没有调用outputStream.flush(),Socket输出流默认带缓冲区,数据只存在本地缓冲区没有真正发送到网络对端,导致对方无法收到数据。需要在客户端和服务端的writeMessage方法中,写完数据后立刻调用flush。 - 发送时未判断连接状态
Socket的connect/accept操作是在子线程异步执行的,初始化完SocketsRepository后直接调用发送方法时,很可能连接还未建立、outputStream还未初始化,此时写数据会抛出空指针异常,但writeMessage里的空catch块吃掉了所有异常,没有崩溃也没有日志提示。需要增加连接状态标记,只有连接成功后才允许调用发送逻辑,同时给catch块加错误日志打印方便排查。 - UI更新逻辑失效
- ViewModel里一直把同一个
ArrayList实例post给LiveData,LiveData检测不到引用变化,不会触发Observer回调。 - 就算LiveData触发了回调,Fragment里的判断逻辑
if (it != messages)永远不成立,因为it和本地的messages是同一个对象引用,不会执行UI更新逻辑。
修复方案:每次更新消息列表时要么拷贝新的ArrayList实例通知LiveData,要么去掉引用相等的判断,收到LiveData回调直接更新Adapter数据后调用notifyDataSetChanged。
- ViewModel里一直把同一个
- 读数据异常未退出循环
读数据的while循环里,就算抛出异常(比如连接断开)也会一直死循环占用资源,建议捕获到异常后break退出循环。
内容的提问来源于stack exchange,提问作者Muhammad Ali
相关产品推荐
相关产品推荐

