我有应用程序根据用户活动进行一些网络连接。应用程序发送的常用有效负载为100-200字节,因此基本上没有繁重的任务。这些任务通常无任何问题(统计上99.9%或请求都很好),但除了这些网络活动,我的应用程序还发送心跳回到我们的服务器(在亚马逊的EC2上(us-east1-) d如果这很重要))。 Heartbeat每10秒发送一次作为普通的POST请求通过HTTPS发送 - 这对我来说并不是真的有效,因为失败率比正常的网络活动高得多 - 在我最近的7小时测试期间,25%的心跳请求失败(但我看到甚至35%的跌幅)它通常保持这个速度。当我禁用SSL时,我的测试设备上的错误率保持在8%。如果这些故障落入任何模式(即每个第4个等等可能意味着某些基于速率的过滤,或者会在接近每个整整一小时或一天的时间内失败,这可能意味着请求上限设置在某处),这可能不会是一个大问题)。但是没有这样的事情发生 - 有时10-15请求可能会连续失败,这对心跳是不利的。此外,更糟糕的是,目前我看到请求失败,我可以从同一设备连接到服务器,这没有问题)。任何受支持的Android版本(2.2 +)都会出现此问题。
我使用最近的httpclientandroidlib来执行HTTP请求,所以我开始怀疑lib是罪魁祸首所以我切换到Android Asynchronous HTTP Client但它没有给出任何改变。我主要得到的例外情况如下:
NoHttpResponseException:目标服务器无法响应 目标服务器无法回复网址:https://xx.xx.xx.xx/heartbeat/
并且对于启用SSL的连接:
javax.net.ssl.SSLException:读取错误:ssl = 0x784bc588:I / O错误 在系统调用期间,由对等方重置连接读取错误: ssl = 0x784bc588:系统调用期间的I / O错误,由对等方重置连接 网址:https://xx.xx.xx.xx/heartbeat/
我基本上想首先跟踪罪魁祸首,所以知道应用程序主要是通过移动网络运行,我愿意接受有关如何继续解决这个问题的任何建议,因为我现在暂时停留了一下。
答案 0 :(得分:0)
运行此应用,只需执行常规ping即可查看错误率:https://play.google.com/store/apps/details?id=com.ulfdittmer.android.ping
在移动网络(手机)和WiFi上运行。
如果您使用的是WiFi,请从笔记本电脑运行ping -n 100 google.com
以验证您的路由器和网络接入点是不是非常不稳定。如果是这样,请拔掉路由器并将其重新插入.Linksys路由器和接入点以及Belkin接入点都会出现这种情况。
如果需要10s心跳,请将HTTP超时设置为3-5秒并快速失败,如果失败则重试。
答案 1 :(得分:0)
如果你在hearthbeat线程和ui线程中共享你的HttpClient实例,那么常规的http连接请求可能会取消正在进行的http连接请求。请确保它们不会同时发送请求,方法是锁定对象或分隔HttpClient实例。