Keep Alive在iOS上无法正常工作
我目前正在开发一个应用程序,我们需要一些请求尽快点击我们的服务器.为了加快请求过程,我们必须消除握手(因为它需要额外的)并且具有永久连接.
该应用程序使用Alamofire框架向我们的服务器发出所有请求,设置如下: 我们有一个使用默认配置和http标头设置的会话管理器. lazy var sessionManager: Alamofire.SessionManager = { let configuration = URLSessionConfiguration.default configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders let manager = Alamofire.SessionManager(configuration: configuration) return manager }() 会话管理器在所有请求中都是持久的.每个请求都使用以下代码进行: self.sessionManager.request(request.urlString,method: request.method,parameters: request.parameters) .responseJSON { [weak self] response in // Handle the response } request.urlString是我们服务器“http://ourserver.com/example”的网址 request.method设置为发布 request.parameters是一个参数字典 请求工作正常,我们得到了有效的回复.问题出现在保持活动计时器上,由我们的服务器设置为300秒.该设备在wifi上保持连接最多30秒,并通过GSM几乎立即关闭. 服务器调试 我们在服务器上进行了一些调试,发现了以下结果 测试: 测试1: > iPhone通过WiFi连接到互联网 测试2: > iPhone通过3G连接到互联网 行为: >两种情况:app通过“Connection:keep-alive”向Web服务器发出HTTP / 1.1请求;服务器(服务器ip = 10.217.81.131)以“Keep-Alive:timeout = 300,max = 99”作为响应 测试1登录服务器端: >在23.101902,应用程序通过“Connection:keep-alive”向服务器发出HTTP / 1.1 POST请求 >在23.139422,服务器响应HTTP / 1.1 200 OK,“Connection:Keep-Alive”和“timeout = 300”(300秒) >往返时间(RTT)报告为333.82毫秒(这突出了我们对以下时间戳的误差幅度): >但是,应用程序会在30秒内关闭连接(大约考虑到Internet传输的变化 – 54.200863和23.451979时间戳之间的差异): >测试重复多次,大约一次.始终监控30秒的时间 测试2登录服务器端: >来自应用程序的HTTP / 1.1 POST请求: >接受保持活动的HTTP OK服务器响应并设置为300秒: > RTT为859.849毫秒 该应用程序立即关闭连接,其中立即是21.197918 – 18.747780 = 2.450138秒 从WiFi切换到3G并重新进行测试,并记录相同的结果. 客户端调试 使用WiFi 第一次尝试(建立连接) Optional( [AnyHashable("Content-Type"): text/html,AnyHashable("Content-Encoding"): gzip,AnyHashable("Content-Length"): 36,AnyHashable("Set-Cookie"): user_cookieuser_session=HXQuslXgivCRKd%2BJ6bkg5D%2B0pWhCAWkUPedUEGyZQ8%2Fl65UeFcsgebkF4tqZQYzVgp2gWgAQ3DwJA5dbXUCz4%2FnxIhUTVlTShIsUMeeK6Ej8YMlB11DAewHmkp%2Bd3Nr7hJFFQlld%2BD8Q2M46OMRGJ7joOzmvH3tXgQtRqR9gS2K1IpsdGupJ3DZ1AWBP5HwS41yqZraYsBtRrFnpGgK0CH9JrnsHhRmYpD40NmlZQ6DWtDt%2B8p6eg9jF0xE6k0Es4Q%2FNiAx9S9PkhII7CKPuBYfFi1Ijd7ILaCH5TXV3vipz0TmlADktC1OARPTYSwygN2r6bEsX15Un5WUhc2caCeuXnmd6xy8sbjVUDn72KELWzdmDTl6p5fRapHzFEfGEEg2LOEuwybmf2Nt6DHB6o6EA5vfJovh2obpp4HkIeAQ%3D; expires=Sun,08-Jan-2017 12:51:43 GMT; path=/,AnyHashable("Keep-Alive"): timeout=300,max=100,AnyHashable("Connection"): Keep-Alive,AnyHashable("X-Powered-By"): PHP/5.3.10-1ubuntu3.11,AnyHashable("Server"): Apache/2.2.22 (Ubuntu),AnyHashable("Vary"): Accept-Encoding,AnyHashable("Date"): Sun,08 Jan 2017 10:51:43 GMT]) 第二次尝试(在30秒内,连接仍然存在) Optional([AnyHashable("Content-Type"): text/html,max=99,08 Jan 2017 11:00:18 GMT]) 然后30秒后连接下降(FI) 使用3G 第一次尝试 Optional([AnyHashable("Content-Type"): text/html,AnyHashable("Connection"): keep-alive,08 Jan 2017 11:04:31 GMT]) 然后连接几乎立即下降. 解决方法
现在我第二次看了代码,我想我看到了问题.底层的NSURLSession类默认忽略keep-alive标头,因为有些服务器“支持”它,但实际上,如果你真的试图使用它,那么就会严重破坏,IIRC.
如果您希望会话支持keep-alive,则必须在会话配置中将HTTPShouldUsePipelining明确设置为YES. 请注意,仍然无法保证连接能够保持正常,这取决于iOS决定如何积极管理收音机,但至少你会有一个祷告. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |