关于在android平台使用nanohttpd实现的http服务在WIFI环境下响应明显太慢的问题

本文的标题是按我在实际项目中遇到的情况来表述的,其实这个标题并不准确,当我搞清楚问题的原因后,觉得准确的标题应该是 《关于nanohttpd (2.3.1)运行响应变慢的问题》,也就是说问题的发生与android平台和WIFI环境没有直接关系,与nanohttpd版本有关。

nanohttpd 是什么这就不介绍了,我们在开发一个项目时要在android平台上实现一个WEB服务,就用到了nanohttpd.确实挺好用的,这个框架很小,但扩展性很好,没花多少时间就实现项目需要的WEB服务,开发测试都正常。

但是android设备在WIFI环境下运行时,通过WEB访问,能感觉明显比接网线时要慢。很长时间我们都找不到问题的原因,都打算放弃nanohttpd另觅框架替代了,但是换框架重新开发代价比较大,实在舍不得,我还想再抢救一下,我就又在google上的一统找,发现2017年就有人在github/nanohttpd上提出了这个问题:
《Very slow loading in version 2.3.0》
https://github.com/NanoHttpd/nanohttpd/issues/318

我用的 nanohttpd 版本是2.3.1,也最近发布的版本(2016年),对症哦

nanohttpd这个项目版本更新很慢,最近一个release 版本2.3.1是2016年的,近4年没有release新版本

仔细看上面这个话题,你会发现有人已经找到了问题的规律,是HTTPSession构造方法中调用InetAddress.getHostName()方法导致变慢

关于在android平台使用nanohttpd实现的http服务在WIFI环境下响应明显太慢的问题_第1张图片

进一步,查看nanohttpd的提交记录,发现最后一次PR合并(2019年),就是解决这个问题的
关于在android平台使用nanohttpd实现的http服务在WIFI环境下响应明显太慢的问题_第2张图片

这是最后一次提交的链接:
https://github.com/NanoHttpd/nanohttpd/commit/cd37235110d6712204c77e2bdc463e84af6ed4e3

所以根本原因就是因为调用InetAddress.getHostName()方法要通过DNS解析来实现,导致产生网络访问,而花费大量时间,与android平台和WIFI环境无关,只是WIFI环境下网络访问延迟大,慢的更明显。

好了,现在问题搞清楚了,nanohttpd master分支上已经解决了这个问题,只是nanohttpd没有release版本。
所以解决问题的方法有如下可选:

使用快照版本
如果你不太讲究,不在意使用快照版本,那就啥也不改,直接下载nanohttpd源码,编译使用master分支下的快照版本2.3.2-SNAPSHOT

release to maven
如果你不希望使用快照版本,那就得自己编译master分支,release一个版本到maven中央仓库或你的私有仓库。
你也可以使用我发布到maven中央仓库的版本,

    
        com.gitee.l0km
        nanohttpd
        2.3.4
      

我复制了nanohttpd的仓库到码云
https://gitee.com/l0km/nanohttpd
我只是为了发布版本到maven中央仓库,修改了pom.xml(l0km分支),比如nanohttpd项目的groupID(com.gitee.l0km),以及为了在JDK8能正常编译而修改了javadoc插件参数等等
 

————————————————
版权声明:本文为CSDN博主「10km」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/10km/article/details/108235947

你可能感兴趣的:(http,优化,android,http,网络协议)