本文目录导读:

我来为您提供一个Java 18的简单Web服务器案例,Java 18引入了SimpleWebServer,这是一个命令行工具,也提供了编程API。
最简单的Web服务器(使用命令行工具)
Java 18自带了一个简单的Web服务器工具,可以直接在命令行使用:
# 在指定目录启动Web服务器,默认端口8000 jwebserver -d /path/to/your/directory -p 8000 # 或者使用简写 jwebserver --directory /path/to/your/directory --port 8000
使用SimpleFileServer API(编程方式)
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.SimpleFileServer;
import java.net.InetSocketAddress;
import java.nio.file.Path;
public class SimpleStaticServer {
public static void main(String[] args) throws Exception {
// 指定静态文件目录
Path root = Path.of("/path/to/your/web/files");
// 创建简单的文件服务器
HttpServer server = SimpleFileServer.createFileServer(
new InetSocketAddress(8080),
root,
SimpleFileServer.OutputLevel.VERBOSE
);
// 启动服务器
server.start();
System.out.println("静态文件服务器已启动: http://localhost:8080");
System.out.println("服务目录: " + root.toAbsolutePath());
System.out.println("按 Ctrl+C 停止服务器");
}
}
自定义HTTP处理器(更灵活的方案)
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
public class SimpleWebServer {
private HttpServer server;
private Map<String, HttpHandler> routes = new HashMap<>();
public static void main(String[] args) throws IOException {
SimpleWebServer webServer = new SimpleWebServer();
webServer.start(8080);
}
public void start(int port) throws IOException {
// 创建HTTP服务器
server = HttpServer.create(new InetSocketAddress(port), 0);
// 注册不同的路由
registerRoutes();
// 添加默认处理器(处理404)
server.createContext("/", exchange -> {
if (!routes.containsKey(exchange.getRequestURI().getPath())) {
handle404(exchange);
}
});
// 启动服务器
server.setExecutor(null); // 使用默认的执行器
server.start();
System.out.println("Web服务器已启动: http://localhost:" + port);
System.out.println("可用路由:");
routes.keySet().forEach(route -> System.out.println(" " + route));
}
private void registerRoutes() {
// 首页路由
routes.put("/", exchange -> {
String response = """
<!DOCTYPE html>
<html>
<head>
<title>我的第一个Java Web服务器</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; }
h1 { color: #4CAF50; }
.info { background-color: #f0f0f0; padding: 15px;
border-radius: 5px; margin-top: 20px; }
a { color: #2196F3; text-decoration: none; }
a:hover { text-decoration: underline; }
</style>
</head>
<body>
<h1>🚀 我的简单Web服务器</h1>
<p>这是一个使用 Java 18 创建的简单Web服务器</p>
<div class="info">
<h3>可用的路由:</h3>
<ul>
<li><a href="/">/</a> - 首页</li>
<li><a href="/about">/about</a> - 关于页面</li>
<li><a href="/api/time">/api/time</a> - 获取当前时间</li>
<li><a href="/api/user">/api/user</a> - 用户信息JSON</li>
<li><a href="/json">/json</a> - 返回JSON数据</li>
<li><a href="/form">/form</a> - 提交表单</li>
</ul>
<p>当前时间: %s</p>
</div>
</body>
</html>
""".formatted(LocalDateTime.now());
sendResponse(exchange, 200, "text/html", response);
});
// 关于页面
routes.put("/about", exchange -> {
String response = """
<!DOCTYPE html>
<html>
<head>
<title>lt;/title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; }
h1 { color: #2196F3; }
.highlight { background-color: #FFEB3B; padding: 2px 5px; }
</style>
</head>
<body>
<h1>关于这个服务器</h1>
<p>这个服务器使用以下技术构建:</p>
<ul>
<li><strong>Java版本:</strong> 18</li>
<li><strong>HTTP API:</strong> com.sun.net.httpserver</li>
<li><strong>特性:</strong> 简单、快速、轻量级</li>
</ul>
<p>返回 <a href="/">首页</a></p>
</body>
</html>
""";
sendResponse(exchange, 200, "text/html", response);
});
// 时间API
routes.put("/api/time", exchange -> {
Map<String, String> timeData = new HashMap<>();
timeData.put("time", LocalDateTime.now().toString());
timeData.put("epoch", String.valueOf(System.currentTimeMillis()));
String json = toJson(timeData);
sendResponse(exchange, 200, "application/json", json);
});
// 用户信息JSON
routes.put("/api/user", exchange -> {
Map<String, Object> user = new HashMap<>();
user.put("id", 1);
user.put("name", "张三");
user.put("email", "zhangsan@example.com");
user.put("roles", new String[]{"admin", "user"});
String json = toJson(user);
sendResponse(exchange, 200, "application/json", json);
});
// 返回JSON示例
routes.put("/json", exchange -> {
Map<String, Object> data = Map.of(
"message", "欢迎使用JSON API",
"status", "success",
"code", 200
);
String json = toJson(data);
sendResponse(exchange, 200, "application/json", json);
});
// 表单处理
routes.put("/form", exchange -> {
if ("GET".equals(exchange.getRequestMethod())) {
// 显示表单
String response = """
<!DOCTYPE html>
<html>
<head>
<title>表单提交</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; }
form { max-width: 400px; margin: 20px 0; }
input[type="text"], textarea {
width: 100%; padding: 8px; margin-bottom: 10px;
}
input[type="submit"] {
background-color: #4CAF50; color: white;
padding: 10px 20px; border: none; cursor: pointer;
}
</style>
</head>
<body>
<h1>表单提交</h1>
<form method="POST" action="/form">
<label>姓名:</label><br>
<input type="text" name="name"><br><br>
<label>留言:</label><br>
<textarea name="message" rows="4"></textarea><br><br>
<input type="submit" value="提交">
</form>
<p>返回 <a href="/">首页</a></p>
</body>
</html>
""";
sendResponse(exchange, 200, "text/html", response);
} else if ("POST".equals(exchange.getRequestMethod())) {
// 处理表单提交
String requestBody = new String(exchange.getRequestBody().readAllBytes());
sendResponse(exchange, 200, "text/plain",
"表单接收成功!\n数据: " + requestBody);
}
});
}
private void sendResponse(HttpExchange exchange, int statusCode,
String contentType, String response) throws IOException {
byte[] bytes = response.getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().set("Content-Type", contentType);
exchange.getResponseHeaders().set("Connection", "close");
exchange.sendResponseHeaders(statusCode, bytes.length);
OutputStream os = exchange.getResponseBody();
os.write(bytes);
os.close();
}
private void handle404(HttpExchange exchange) throws IOException {
String response = """
<!DOCTYPE html>
<html>
<head><title>404 - Not Found</title></head>
<body>
<h1>404 - 页面不存在</h1>
<p>抱歉,请求的资源不存在。</p>
<p><a href="/">返回首页</a></p>
</body>
</html>
""";
sendResponse(exchange, 404, "text/html", response);
}
private String toJson(Map<?, ?> map) {
StringBuilder json = new StringBuilder("{");
int index = 0;
for (Map.Entry<?, ?> entry : map.entrySet()) {
if (index++ > 0) {
json.append(",");
}
json.append("\"")
.append(escapeJson(String.valueOf(entry.getKey())))
.append("\":\"")
.append(escapeJson(String.valueOf(entry.getValue())))
.append("\"");
}
json.append("}");
return json.toString();
}
private String escapeJson(String text) {
return text.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\n", "\\n")
.replace("\r", "\\r");
}
// 停止服务器的方法
public void stop() {
if (server != null) {
server.stop(0);
System.out.println("服务器已停止");
}
}
}
项目结构示例
web-server/
├── src/
│ └── com/example/server/
│ └── SimpleWebServer.java
├── web/
│ ├── index.html
│ ├── css/
│ │ └── style.css
│ └── images/
├── pom.xml (如果需要Maven)
└── README.md
Maven配置(如果需要)
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>simple-web-server</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>18</maven.compiler.source>
<maven.compiler.target>18</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>18</source>
<target>18</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
运行示例
# 编译 javac -d out SimpleWebServer.java # 运行 java -cp out SimpleWebServer # 或者使用Java 18的新运行时方式 java --source 18 SimpleWebServer.java
测试服务器
启动后,访问以下URL:
- http://localhost:8080/ - 首页
- http://localhost:8080/about - 关于页面
- http://localhost:8080/api/time - 获取时间JSON
- http://localhost:8080/api/user - 用户信息JSON
- http://localhost:8080/form - 表单页面
这个Web服务器虽然简单,但提供了基本的HTTP功能,适合学习、开发和测试使用,可以根据需要扩展更多功能,比如添加路由参数、数据库连接、模板引擎等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播