- 从零开始实现一个简单的 Web 服务器:这有助于你理解 Web 服务器背后的基本原理(如 HTTP 协议、Socket 编程)。
- 使用成熟的 Web 框架(如 Spring Boot)来构建和调用 Web 服务器:这是在实际项目中更常见、更高效的方式。
从零开始实现一个简单的 Java Web 服务器
这种方式能让你深刻理解 HTTP 请求和响应的底层工作方式,我们将使用 Java 原生的 java.net.ServerSocket 和 java.net.Socket API。

核心原理
- 监听端口:服务器在指定的端口(如 8080)上等待客户端的连接。
- 接受连接:当有客户端(如浏览器)发起连接请求时,服务器接受它,并创建一个新的
Socket来与该客户端进行通信。 - 读取请求:从
Socket的输入流中读取客户端发送的 HTTP 请求报文。 - 解析请求:解析 HTTP 请求,获取请求方法(GET/POST)、路径(URI)、协议版本等信息。
- 生成响应:根据请求路径,构建一个 HTTP 响应报文,如果是请求一个静态文件(如
index.html),就读取文件内容并放入响应体中。 - 发送响应:将构建好的 HTTP 响应报文通过
Socket的输出流发送回客户端。 - 关闭连接:关闭与当前客户端的连接,然后等待下一个客户端的连接。
代码实现
下面是一个功能简单的 Web 服务器,它可以处理对根路径 的 GET 请求,并返回一个 "Hello, World!" 的 HTML 页面。
SimpleWebServer.java
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleWebServer {
// 监听的端口号
private static final int PORT = 8080;
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("Web Server started on port " + PORT);
System.out.println("Visit http://localhost:" + PORT + " to see the response.");
// 服务器无限循环,等待客户端连接
while (true) {
try (Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
// 1. 读取客户端的HTTP请求
String requestLine;
StringBuilder requestBuilder = new StringBuilder();
// 读取请求头,直到遇到空行
while ((requestLine = in.readLine()) != null && !requestLine.isEmpty()) {
requestBuilder.append(requestLine).append("\r\n");
}
String request = requestBuilder.toString();
System.out.println("--- Received Request ---");
System.out.println(request);
// 2. 解析请求
String[] requestParts = request.split(" ");
String method = requestParts[0];
String path = requestParts[1];
String httpVersion = requestParts[2];
// 3. 构建HTTP响应
String response;
if (path.equals("/")) {
// 如果请求根路径,返回一个简单的HTML页面
String html = "<html><head><title>Simple Java Web Server</title></head>"
+ "<body><h1>Hello from a Simple Java Web Server!</h1></body></html>";
response = buildResponse("200 OK", "text/html", html);
} else {
// 其他路径返回404 Not Found
response = buildResponse("404 Not Found", "text/plain", "404 Not Found");
}
// 4. 发送响应给客户端
out.print(response);
out.flush();
System.out.println("--- Sent Response ---");
System.out.println(response);
System.out.println("----------------------\n");
} catch (IOException e) {
System.err.println("Error handling client connection: " + e.getMessage());
}
}
} catch (IOException e) {
System.err.println("Could not start server on port " + PORT + ": " + e.getMessage());
}
}
/**
* 辅助方法:构建一个完整的HTTP响应
* @param statusCode 状态码,如 "200 OK"
* @param contentType 内容类型,如 "text/html"
* @param body 响应体内容
* @return 完整的HTTP响应字符串
*/
private static String buildResponse(String statusCode, String contentType, String body) {
return "HTTP/1.1 " + statusCode + "\r\n" +
"Content-Type: " + contentType + "\r\n" +
"Content-Length: " + body.length() + "\r\n" +
"Connection: close\r\n" +
"\r\n" +
body;
}
}
如何运行和调用
- 保存代码:将上述代码保存为
SimpleWebServer.java。 - 编译:在终端中,进入文件所在目录,运行
javac SimpleWebServer.java。 - 运行:运行
java SimpleWebServer。 - 调用:打开你的网页浏览器,在地址栏输入
http://localhost:8080。 - 查看结果:浏览器会显示 "Hello from a Simple Java Web Server!",你可以在服务器的控制台看到详细的 HTTP 请求和响应日志。
使用 Spring Boot 框架构建和调用 Web 服务器
在实际开发中,几乎没有人会从零开始写 Web 服务器,我们会使用成熟、稳定、功能强大的框架,Spring Boot 是目前 Java 生态中最流行的选择,它极大地简化了创建独立、生产级基于 Spring 的应用程序的过程。
核心概念
- Spring Boot:一个快速构建 Spring 应用的框架,它通过“约定优于配置”的原则,自动配置了大量常用的组件。
- Spring Web:Spring Boot 的一个 starter,它集成了 Spring MVC 框架,用于构建 Web 应用(包括 RESTful API)。
@RestController:一个注解,用于标记一个类作为控制器,它的方法通常返回数据(如 JSON 或 XML)而不是视图页面。@GetMapping/@PostMapping:注解,用于将 HTTP 请求映射到控制器的方法上。@GetMapping处理 GET 请求,@PostMapping处理 POST 请求。
实现步骤
-
创建项目:最简单的方式是使用 Spring Initializr (start.spring.io)。
(图片来源网络,侵删)- Project: Maven Project
- Language: Java
- Spring Boot: 选择一个较新的稳定版本 (如 3.x.x)
- Project Metadata:
- Group:
com.example - Artifact:
demo - Name:
demo - Packaging: Jar
- Java: 17 (或你安装的版本)
- Group:
- Dependencies: 添加
Spring Web。
-
生成项目并导入:点击 "GENERATE" 按钮,下载生成的 ZIP 文件,并用你的 IDE(如 IntelliJ IDEA 或 VS Code)打开它。
-
编写 Controller 代码:IDE 会自动创建一个
DemoApplication.java文件,在这个文件所在的包下,创建一个新的 Controller 类。
HelloController.java
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
// @RestController 告诉 Spring 这是一个 Web 控制器
@RestController
public class HelloController {
// @GetMapping 映射 HTTP GET 请求到 /hello 路径
// @RequestParam 用于从请求中获取参数,name="name" 对应 ?name=xxx
@GetMapping("/hello")
public String sayHello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello, %s! Welcome to Spring Boot.", name);
}
// 另一个简单的端点,返回 JSON 数据
@GetMapping("/api/greeting")
public Greeting getGreeting() {
return new Greeting(1, "你好,Spring Boot!");
}
// 内部类,用于表示返回的JSON结构
public static class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
}
如何运行和调用
- 运行:在 IDE 中找到
DemoApplication.java文件,右键点击 "Run",或者,在项目根目录的终端中运行./mvnw spring-boot:run(Linux/macOS) 或mvnw spring-boot:run(Windows)。 - 服务器启动:Spring Boot 会自动启动一个嵌入式的 Tomcat 服务器,默认监听在 8080 端口。
- 调用:
- 打开浏览器或使用 API 工具(如 Postman、curl)访问:
http://localhost:8080/hello-> 会返回Hello, World! Welcome to Spring Boot.http://localhost:8080/hello?name=Alice-> 会返回Hello, Alice! Welcome to Spring Boot.http://localhost:8080/api/greeting-> 会返回 JSON 数据:{"id":1,"content":"你好,Spring Boot!"}
- 打开浏览器或使用 API 工具(如 Postman、curl)访问:
总结与对比
| 特性 | 从零开始实现 | 使用 Spring Boot |
|---|---|---|
| 复杂度 | 高,需要处理 Socket、IO、多线程、HTTP 协议细节。 | 极低,通过注解和自动配置,几行代码即可创建功能强大的 Web 服务。 |
| 功能 | 非常有限,通常只能实现静态文件服务和简单的动态逻辑。 | 非常强大,支持 RESTful API、模板引擎、安全、数据访问、事务等几乎所有企业级功能。 |
| 性能 | 对于简单请求尚可,但难以实现高性能(如 NIO、连接池)。 | 高性能,基于成熟的 Spring 框架,支持异步处理、嵌入式服务器(Tomcat, Netty)等优化。 |
| 适用场景 | 学习与研究,用于理解计算机网络和 Web 协议的底层原理。 | 生产环境,用于快速构建和部署各种规模的 Web 应用和微服务。 |
| 依赖管理 | 只需 JDK。 | 需要管理 Maven/Gradle 依赖,但 Spring Initializr 使其变得非常简单。 |
- 如果你是一名学生或开发者,想深入理解 Web 服务器的工作原理,从零开始实现是一个非常有价值的练习。
- 如果你的目标是实际开发一个 Web 应用或 API,请毫不犹豫地选择 Spring Boot 或其他类似框架(如 Jakarta EE, Micronaut, Quarkus),它能让你专注于业务逻辑,而不是底层基础设施。

