程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 程序退到后台的时候,所有线程被挂起,系统回收所有的socket资源问题及解决方案

工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题:

当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输。

注意:系统不会回收开启定位服务并且正在正常通信的socket资源,也不是进入后台就建立不了socket,而是进入后台断网8分钟左右及以后就申请不到新的socket资源了,并且你的建立socket资源的线程或守护线程,日志线程都会被永远挂起(和被干掉是一样的效果)。

当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输。

实际测试时,开启后台定位的应用,当应用进入后台前长连接已经建立,切换到后台后一直有正常的网络,那并且有定位信号那么长连接,守护线程,日志线程都正常。

当进入的后台时正在执行connect连接时有可能永远组赛长连接线程,断网8分钟以上。

当进入后台时有网络,有正常的长连接。然后断开网络,当用户不移动位置8分钟,当连接上网络时,日志线程,守护线程,长连接线程全部(注意:应用的主线程不会被苹果系统杀死,除非出现内存的特殊情况)被ios系统杀死,无法在后台建立长连接。

咱们的应用不应该设置为voip服务,应为voip需要托管socket,最小600秒才醒来一次,让客户端有10秒的时间向服务器发送请求和处理,当然当服务器通过该通道发送消息,客户端立即被唤醒10秒。但是咱们需要10秒向服务器发送一次请求显然最小600秒的限制,并且当手机断网,这个长连接断掉也没有实时发现,所以实时通信应用不适合用voip服务。只能用普通socket。

解决方案:定位回掉函数,进入前台事件和用户UI操作触发的请求能够发现长连接线程挂掉,并且重起长连接线程。

参考文章:

iOS后台如何保持socket长连接和数据传输(http://blog.csdn.net/zhangkongzhongyun/article/details/38678137)

IOS实现Voip应用后台运行需要的几个配置项(http://blog.csdn.net/martin_liang/article/details/40818835)

1、 handler

需要说明的是,这个handler在后台执行的时候需要尽可能快的返回,因为系统只给了最多10s的时间去执行它。如果10s内没有执行完,而且没有去申请额外的执行时间,系统将会吧app挂起。

2、timeout

设置handler时,需要指定app需要的最大超时时间。IOS系统允许的最小值是600s,如果想设置个小点的值,handler的设置就会失败。系统在执行handler内容的时候,只保证超时时间到之前会执行,而不保证准确的执行时间点,系统是会根据当时的任务情况等系统条件确定一个合适的时间点,已达到延长电池寿命的目的。

所以无网络进入后台,设置voip也不能保证,应用进入后台8分钟后,守护线程,长连接线程,日志线程不被挂起。 甚至应用被杀掉。所以要在进入后台时要保证有网络,进入前台时要监控守护线程和长连接线程是否还活着。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
392 0
|
12月前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
237 7
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
390 0
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
144 3
|
Java
在Java中,死锁是指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的情况。
【6月更文挑战第24天】在Java并发中,死锁是多线程互相等待资源导致的僵局。避免死锁的关键策略包括:防止锁嵌套,设定固定的加锁顺序,使用`tryLock`带超时,避免无限等待,减少锁的持有时间,利用高级同步工具如`java.util.concurrent`,以及实施死锁检测和恢复机制。通过这些方法,可以提升程序的并发安全性。
140 1
|
Java Go 调度
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
179 0
|
存储 安全 Java
Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
Java面试题:假设你正在开发一个Java后端服务,该服务需要处理高并发的用户请求,并且对内存使用效率有严格的要求,在多线程环境下,如何确保共享资源的线程安全?
228 0
|
网络协议 Java
Java Socket编程 - 基于TCP方式的客户服务器聊天程序
Java Socket编程 - 基于TCP方式的客户服务器聊天程序
221 0
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
155 6
|
5月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
306 83

热门文章

最新文章