NanoHTTPD

关注
义项:Java嵌入式HTTP服务器
NanoHTTPD

NanoHTTPD是一个用Java语言编写的轻量级HTTP服务器,设计目标是被嵌入到其他应用程序中,以修改版BSD许可证发布[1][2]。它的核心实现只有一个Java源文件,提供HTTP 1.1支持,也可以作为独立的文件服务器运行[2][1]。最初版本在2003年发布,由于不依赖JDK 1.1以上的Java特性,常被用于嵌入式应用与安卓软件的开发[1][3]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

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]。

参见

  • Jetty —— 另一款用Java编写的HTTP服务器与Servlet容器,常与NanoHTTPD这类嵌入式服务器对比。

  • WebSocket —— NanoHTTPD提供独立的WebSocket实现模块,用于双向实时通信。

  • HTTP —— NanoHTTPD实现的核心协议,其支持程度随版本演进逐步扩展。

  • Servlet —— NanoHTTPD的Nanolets模块提供了类似Servlet的轻量应用服务器机制。

  • 微型框架 —— 以体量小、依赖少为特征的软件框架类别,NanoHTTPD属于这一取向的服务器实现。

参考资料

  1. NanoHTTPD [引用日期2026-10-14]
  2. README.md - NanoHTTPD – a tiny web server in Java [引用日期2026-10-14]
  3. 'nanohttpd' tag wiki [引用日期2026-10-14]
  4. nanohttpd [引用日期2026-10-14]
  5. package com [引用日期2026-10-14]
  6. NanoHTTPD [引用日期2026-10-14]
  7. github.com 上的网页 [引用日期2026-10-14]
  8. Cross Reference: /external/nanohttpd/ - Name | Date | Size [引用日期2026-10-14]
  9. nanohttpd [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T20:39:27Z

历史版本

本条目引用的词条
服务器套接字 安卓 Jetty WebSocket HTTP Servlet 微型框架