问题背景

应用使用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');
})

HarmonyOS码上奇行
6.7k 声望2.7k 粉丝