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

2023-10-26 16:17:12 +08:00
 rcj6056

目前通过 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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/985692

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX