Java 的 HTTP 服务器是一种基于 Java 语言实现的服务端应用程序,能够通过 HTTP 协议与客户端进行通信,处理请求并返回响应,它无需依赖外部 Web 服务器(如 Apache 或 Nginx),可直接运行在 Java 虚拟机(JVM)中,适用于开发、测试、小型应用或微服务场景,Java 提供了内置的 HTTP 服务器 API(位于 com.sun.net.httpserver 包),同时也支持通过第三方框架(如 Spring Boot、Jetty、Undertow)构建更复杂的服务器功能。

Java 内置 HTTP 服务器 API
Java 自带的 HTTP 服务器 API 是轻量级的,适合快速搭建简单的 HTTP 服务,其核心类包括 HttpServer 和 HttpHandler,通过 HttpServer.create() 方法可创建服务器实例,并绑定监听端口;通过 createContext() 方法定义 URL 路径与处理器的映射;最后调用 start() 启动服务器,以下代码创建一个监听 8080 端口的服务器,根路径请求返回 "Hello, World!":
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
public class SimpleHttpServer {
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/", new HelloHandler());
server.start();
System.out.println("Server started on port 8080");
}
static class HelloHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "Hello, World!";
exchange.sendResponseHeaders(200, response.length());
try (OutputStream os = exchange.getResponseBody()) {
os.write(response.getBytes());
}
}
}
}
内置 API 的优缺点
Java 内置 HTTP 服务器的优势在于无需额外依赖,适合快速原型开发和简单服务,但其功能有限,例如不支持 HTTPS(需额外配置)、静态文件服务较复杂、性能不如专业服务器,以下是其主要特点对比:
| 特性 | 内置 API | 第三方框架(如 Spring Boot) |
|---|---|---|
| 依赖管理 | 无需额外依赖 | 需引入框架依赖 |
| 功能丰富度 | 基础功能(路由、简单响应) | 支持模板引擎、数据库集成、安全认证等 |
| 性能 | 中等,适合低并发场景 | 高性能,支持异步和非阻塞 I/O |
| 易用性 | 代码简单,适合快速上手 | 需学习框架,但开发效率高 |
| 扩展性 | 有限,需手动实现复杂功能 | 插件化架构,易于扩展 |
第三方框架的应用
在实际开发中,更常见的是使用第三方框架构建 HTTP 服务器,Spring Boot 通过内嵌 Tomcat、Jetty 或 Undertow,提供了自动配置、RESTful 支持、监控等企业级功能,以下是一个 Spring Boot 示例,通过 @RestController 定义接口:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
class HelloController {
@GetMapping("/")
public String hello() {
return "Hello, Spring Boot!";
}
}
Spring Boot 的优势在于简化配置、集成生态丰富(如 MyBatis、Spring Security),适合构建大型分布式系统,Jetty 和 Undertow 则以轻量和高性能著称,常用于微服务架构。

选择建议
- 学习或简单测试:使用 Java 内置 API,无需额外配置。
- 企业级应用:选择 Spring Boot,平衡开发效率和功能需求。
- 高性能场景:考虑 Jetty 或 Undertow,尤其适合异步和非阻塞处理。
相关问答 FAQs
Q1:Java 内置 HTTP 服务器如何支持 HTTPS?
A1:可通过 HttpsServer 类实现 HTTPS,需创建 SSLContext 并加载密钥库(JKS 或 PKCS12 文件),然后配置 HttpsServer 的 SSLContext,示例代码如下:
HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(8443), 0);
SSLContext sslContext = SSLContext.getInstance("TLS");
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream("keystore.jks"), "password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, "password".toCharArray());
sslContext.init(kmf.getKeyManagers(), null, null);
httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
Q2:Java HTTP 服务器如何处理静态文件?
A2:内置 API 需手动读取文件并设置响应头,将请求路径映射到文件系统:
server.createContext("/static", new HttpHandler() {
@Override
public void handle(HttpExchange exchange) throws IOException {
String path = exchange.getRequestURI().getPath();
Path filePath = Paths.get("static", path.substring("/static".length()));
if (Files.exists(filePath)) {
exchange.getResponseHeaders().set("Content-Type", Files.probeContentType(filePath));
exchange.sendResponseHeaders(200, Files.size(filePath));
Files.copy(filePath, exchange.getResponseBody());
} else {
exchange.sendResponseHeaders(404, 0);
}
}
});
第三方框架(如 Spring Boot)则可通过 addResourceLocations 自动映射静态资源目录。
