定义
NanoHTTPD是一个轻量级、可嵌入的HTTP服务器,采用Java语言实现,以修改版BSD许可证开源发布[1][2]。它既可以作为一个库组件被集成进其他软件,也可以作为独立的临时HTTP守护进程来提供文件服务[1]。项目的核心模块由单个Java文件构成,提供HTTP 1.1支持[2]。
它提供两个“风味”版本,一个使用较新的Java特性,另一个严格兼容Java 1.1,后者使其适合嵌入式应用开发[1]。除核心模块外,项目还包含示例、WebSocket实现、独立文件服务器、类似Servlet的Nanolets模块以及文件上传集成模块[4]。代码托管在GitHub上,使用Apache Maven进行构建与单元测试[2]。
原理
NanoHTTPD的核心类继承自ServerSocket的实现思路:启动时在指定端口绑定一个服务器套接字,并由一个守护线程循环调用accept()等待连接,每接受一个连接就创建一次会话对象来处理该连接[5]。会话对象先读取请求行与头部字段,解析出请求方法、URI和参数,再调用可被重写的serve()方法生成响应[5]。
线程模型是可插拔的:默认的DefaultAsyncRunner为每个进入的请求新建一个线程,这些线程被设为守护线程并按请求序号命名,开发者也可以替换为自定义的异步执行策略[6]。临时文件的创建与清理同样通过抽象工厂交由TempFileManager接口实现,便于按需替换[6]。请求方法以枚举形式定义,包含GET、PUT、POST、DELETE和HEAD,并能把字符串反向解析回对应的枚举值[6]。
发展历程
NanoHTTPD的初始版本于2003年9月15日发布,作者是Jarno Elonen[1][3]。作者当时的诉求是找到一个足够小、可嵌入、容易修改的HTTP服务器,能够直接复制粘贴到自己的其他Java项目里使用[3]。最初的版本只包含简单的HTTP 1.0功能,此后逐渐扩展出keep-alive长连接、完整的REST风格HTTP方法、HTML5视频流以及基于multipart扩展的上传等能力[1]。
2003年的首版以HTTP 1.0与部分1.1功能为主,1.25版中加入了基础的PUT支持,文件上传功能则从2010年的1.2版开始提供[5]。后来另一支团队接手项目,修复了若干缺陷、把构建迁移到Maven,并把示例代码从运行时JAR中分离出来以精简体积[3]。2013年初,两个同名项目合并代码库,以更好地服务用户并减少因存在两个NanoHttpd项目而产生的混淆[3]。
在版本发布方面,2.3.1稳定版于2016年8月12日发布,3.0.0预览版于2016年12月13日发布,原项目后来停止维护,社区分支在其基础上继续加入了依赖安全修复等内容[1][7]。项目的Maven坐标也曾调整,2015年中期groupId由com.nanohttpd改为org.nanohttpd[7]。
应用
NanoHTTPD可以作为库组件用于开发其他软件,例如测量、科学计算和数据库类应用,也可以在安卓设备上提供文件服务[1][2]。由于不依赖JDK 1.1以上的特性,它适合嵌入式应用开发,已有项目用它构建安卓软件[1]。安卓系统源码树中就包含了一个external/nanohttpd模块[8]。
使用方式主要有三类:编写NanoHTTPD的子类来实现专门的HTTP或HTTPS服务;编写NanoWebSocketServer的子类来实现WebSocket服务;或直接使用SimpleWebServer类作为通用文件服务器,该类以当前目录为根目录在8080端口启动服务[7]。文件服务器支持目录列表、index.html与index.htm索引文件、部分内容传输、ETags、断点续传以及为缺失斜杠的目录做301重定向[4]。它还内置了常见MIME类型列表,并支持通过classpath中的扩展JAR在运行时加载处理特定MIME类型的扩展[4]。
局限
NanoHTTPD的设计取向是精简,核心模块不提供固定的配置文件、日志和授权机制,这些能力需要使用者自行实现,错误信息则交给java.util.logging处理[2]。默认情况下它不缓存任何内容,也不限制带宽、请求时间或并发连接数[4]。
早期的版本在协议支持上也比较有限,只实现HTTP 1.0与部分1.1功能[5]。HTTPS支持在早期文档中被标为实验性,需要自行生成自签名证书并配置keystore才能启用[7][9]。原项目后来不再维护,其续作安全更新依赖社区分支进行[7]。
参见
参考资料
- NanoHTTPD [引用日期2026-10-14]
- README.md - NanoHTTPD – a tiny web server in Java [引用日期2026-10-14]
- 'nanohttpd' tag wiki [引用日期2026-10-14]
- nanohttpd [引用日期2026-10-14]
- package com [引用日期2026-10-14]
- NanoHTTPD [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- Cross Reference: /external/nanohttpd/ - Name | Date | Size [引用日期2026-10-14]
- nanohttpd [引用日期2026-10-14]