问题背景
应用使用TCP/UDP Socket通信,未申请长短时任务的应用退后台,网络不可用,可能会造成应用网络资源异常;切回前台如果使用之前创建的TCP/UDP连接对象继续和服务器通信也会失败。
根因分析
1、后台网络不可用:目前HarmonyOS的规则是应用退后台一定时间后会被冻结,同时在一段时间内释放网络资源,网络不可用;
2、切回前台TCP/UDP的Socket连接对象不可复用:协议栈规则应用冻结后会清空分配给TCP/UDP连接对象源侧的IP和端口,但是不会释放连接对象,切到前台系统会给连接对象重新分配新的源侧IP和端口,继续使用之前的连接对象跟服务器通信,服务器会认为同一个连接对象前后IP和端口不一致,不可信,会返回错误码(如ECOBBRESET)。
应用退后台注意事项
1、退后台切实有场景必需使用网络,可以使用长短时任务对应用做保活;
2、切回前台后对网络通信做失败重试,通信失败后匹配错误码并重新创建新的TCP/UDP连接对象。
tcp.send(tcpSendOptions, (err: BusinessError) => {
if (err) {
// 创建一个TCPSocket连接,返回一个TCPSocket对象。
let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
return;
}
console.log('send success');
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。