本文的标题是按我在实际项目中遇到的情况来表述的,其实这个标题并不准确,当我搞清楚问题的原因后,觉得准确的标题应该是 《关于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()
方法导致变慢
进一步,查看nanohttpd的提交记录,发现最后一次PR合并(2019年),就是解决这个问题的
这是最后一次提交的链接: https://github.com/NanoHttpd/nanohttpd/commit/cd37235110d6712204c77e2bdc463e84af6ed4e3
所以根本原因就是因为调用InetAddress.getHostName()
方法要通过DNS解析来实现,导致产生网络访问,而花费大量时间,与android平台和WIFI环境无关,只是WIFI环境下网络访问延迟大,慢的更明显。
好了,现在问题搞清楚了,nanohttpd master分支上已经解决了这个问题,只是nanohttpd没有release版本。 所以解决问题的方法有如下可选:
如果你不太讲究,不在意使用快照版本,那就啥也不改,直接下载nanohttpd源码,编译使用master分支下的快照版本2.3.2-SNAPSHOT
如果你不希望使用快照版本,那就得自己编译master分支,release一个版本到maven中央仓库或你的私有仓库。 你也可以使用我发布到maven中央仓库的版本,
<dependency>
<groupId>com.gitee.l0km</groupId>
<artifactId>nanohttpd</artifactId>
<version>2.3.4</version>
</dependency>
我复制了nanohttpd的仓库到码云
https://gitee.com/l0km/nanohttpd
我只是为了发布版本到maven中央仓库,修改了pom.xml(l0km分支),比如nanohttpd项目的groupID(com.gitee.l0km
),以及为了在JDK8能正常编译而修改了javadoc插件参数等等