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

简介: 程序退到后台的时候,所有线程被挂起,系统回收所有的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实时生图绘板
目录
相关文章
|
Kubernetes Linux Go
使用 Uber automaxprocs 正确设置 Go 程序线程数
`automaxprocs` 包就是专门用来解决此问题的,并且用法非常简单,只需要使用匿名导入的方式 `import _ "go.uber.org/automaxprocs"` 一行代码即可搞定。
514 78
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
941 62
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
319 6
|
Java
线程池内部机制:线程的保活与回收策略
【10月更文挑战第24天】 线程池是现代并发编程中管理线程资源的一种高效机制。它不仅能够复用线程,减少创建和销毁线程的开销,还能有效控制并发线程的数量,提高系统资源的利用率。本文将深入探讨线程池中线程的保活和回收机制,帮助你更好地理解和使用线程池。
726 2
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
604 0
|
监控 Java API
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
349 4
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
222 3

热门文章

最新文章