V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rcj6056
V2EX  ›  WebSocket

[有偿] 原生 app 开发即时通讯 关于 websocket 长链接的问题

  •  
  •   rcj6056 · 184 天前 · 1358 次点击
    这是一个创建于 184 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前通过 httpclien.webSocketClient 来实现 websocket 的建链 通过 DefaultClientWebSocketSession 来接受服务端推送的消息 session.incoming.receive()

    目前问题是 当 app 退出到后台 锁屏一段时间之后 app 被冻结了 再次打开 app 就会出现 Exception: java.net.SocketTimeoutException: timeout Exception: kotlinx.coroutines.channels.ClosedReceiveChannelException: Channel was closed 类似的异常

    想请问这种情况怎么处理

    ps 提供思路并解决的老哥有红包感谢:D

    20 条回复    2023-10-28 00:22:37 +08:00
    bmwh123
        1
    bmwh123  
       184 天前
    有的国产安卓系统,会禁止长时间运行的应用 service,可能需要把你测试的 app 的安全设置或者自启管理之类的设置一下,还有就是可以使用两个服务互相调用的方式去保活
    NessajCN
        2
    NessajCN  
       184 天前 via Android
    每次从冻结回来肯定要 new 个新 socket client 对象啊,哪能还用之前那个
    henyi2211
        3
    henyi2211  
       184 天前
    断线自动尝试重连。
    如果有状态数据要恢复,就加入会话机制;初次建立连接的时候,服务端发送会话 token 给客户端保存;重连时,尝试使用会话 token 恢复状态
    tool2d
        4
    tool2d  
       184 天前
    手机锁屏 websocket 不是常规状态嘛,客户端重连一下就可以了啊。
    rcj6056
        5
    rcj6056  
    OP
       184 天前
    @bmwh123 项目启动了一个前台进程 在通知栏会有一个小图标 表示 app 还存活着
    但是停留后台超过一定时间就会报 socket 的异常
    JackCh3ng
        6
    JackCh3ng  
       184 天前
    app 电池管理选择不优化,然后锁定后台。
    一般像你这种需求是要上消息推送服务的。
    okakuyang
        7
    okakuyang  
       184 天前 via iPhone
    这就是安卓后台保活吧,我觉得基本无解。可以看看是不是省电模式或者手机优化程序干的。
    JackCh3ng
        8
    JackCh3ng  
       184 天前
    现在的安卓系统对于应用后台长期存在的 service 会在通知中心显式的提醒用户,这应该是安卓的隐私保护策略。然后还有个电池优化管理,会清掉后台不用的 app ,这会导致 app 的一些功能异常。我不是专业的安卓开发,这些是我之前写一个计时器 app 时遇到的问题,我是通过电池优化管理选择不优化来解决的。
    coderxy
        9
    coderxy  
       184 天前
    保活别想了,老老实实做好重连就行了。
    rcj6056
        10
    rcj6056  
    OP
       184 天前
    @okakuyang 确实感觉很难搞 电池里面有个优化启动选项 有个开关
    rcj6056
        11
    rcj6056  
    OP
       184 天前
    @coderxy 好的 我试试
    lty81372860
        12
    lty81372860  
       184 天前
    IM 应用就接各大手机厂的官方推送服务吧,国内各家魔改的系统对于微信这种大体量应用是有白名单的,当然也不对外开放,所以想达到效果就接推送好了。
    lty81372860
        13
    lty81372860  
       184 天前
    实际你可以了解下商用的那些 IM SDK 是怎么保证效果的,最后殊途同归,都是调官方推送服务+调优过的长连接策略
    gowas
        14
    gowas  
       184 天前
    整个错误抑制 要有断线重连
    lty81372860
        15
    lty81372860  
       184 天前
    之前微信技术团队分享过一个他们对于长连接的调优文章,具体可以去他们公众号搜搜。
    babyrjw
        16
    babyrjw  
       184 天前
    感觉部分网络的 NAT 会不定期淘汰 NAT 表,淘汰后这 socket 就没用了,关键是 tcp 的中断检测也麻烦,发一条数据等超时才知道断开。 我以前遇到过在某一次心跳之后服务器发送数据到客户端失败,两边抓包发现客户端和服务器都会偶发性该问题,切换网络就正常
    xiaoming61
        17
    xiaoming61  
       184 天前 via Android
    断线重连必须要有,光有前台服务不够。一些国产系统会在应用后台时禁止联网。
    weeei
        18
    weeei  
       184 天前
    退到后台就主动关闭长连接。切到前台重新连接。后台接收消息主要靠系统级别的推送。
    ifbluethen
        19
    ifbluethen  
       183 天前
    前司用 uniapp 开发 MQTT 应用也是这个问题,最后只能销毁原有的,再新建重连。
    hez2010
        20
    hez2010  
       182 天前
    开发即时通讯的推送消息难道不应该走平台的统一推送吗。。
    Google 服务虽然被墙了但是 FCM 可没有被墙。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2996 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 14:15 · PVG 22:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.