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

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

  •  
  •   rcj6056 · 2023-10-26 16:17:12 +08:00 · 1606 次点击
    这是一个创建于 401 天前的主题,其中的信息可能已经有所发展或是发生改变。

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