Node.js HTTP Server
学过 Node.js 的同学肯定会对创建一个 HttpServer 的代码印象深刻
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Java HttpServer
在 Java 中创建一个 HTTP 服务器同样很简单,Java 提供了内置的 com.sun.net.httpserver.HttpServer
类,使得开发者可以快速搭建一个轻量级的 HTTP 服务器,严格意义上讲,这次是本门课程的 Helllo world!
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpServer;
public class MyFunctionalHttpServer {
public static void main(String[] args) throws Exception {
// 第二个参数 0 表示使用默认的连接队列大小
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/", (exchange -> {
String response = "Hello Java Web!";
exchange.sendResponseHeaders(200, response.length());
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}));
server.setExecutor(null);
server.start();
System.out.println("Server started on port 8080");
}
}
代码几乎可以和 Node.js 版本一一对应,保存上述代码为 SimpleHttpServer.java
,然后在终端中编译:
$ javac SimpleHttpServer.java
$ java SimpleHttpServer
在浏览器访问 http://localhost:8080 可以看到响应内容
可以稍微完善一下代码
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 {
int port = 8000; // 服务器监听端口
HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
// 创建上下文 /hello,关联处理器
server.createContext("/hello", new HelloHandler());
// 设置默认处理器
server.createContext("/", new RootHandler());
server.setExecutor(null); // 使用默认的线程池
server.start();
System.out.println("服务器已启动,访问 http://localhost:" + port);
}
// 处理 /hello 请求的Handler
static class HelloHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
// 仅处理GET请求
if ("GET".equals(exchange.getRequestMethod())) {
String response = "Hello, World!";
exchange.sendResponseHeaders(200, response.getBytes().length); // 发送状态码和响应长度
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
} else {
// 其他方法返回405 Method Not Allowed
exchange.sendResponseHeaders(405, -1);
}
}
}
// 处理根路径 / 的Handler
static class RootHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "欢迎来到简单的Java HTTP服务器!";
exchange.sendResponseHeaders(200, response.getBytes().length);
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}
可以为不同的URL路径设置不同的上下文和处理器,以实现多路由的功能
server.createContext("/api/users", new UsersHandler());
server.createContext("/api/products", new ProductsHandler());
除了 GET 方法,还可以在处理器中添加对 POST、PUT、DELETE 等 HTTP 方法的支持
@Override
public void handle(HttpExchange exchange) throws IOException {
String method = exchange.getRequestMethod();
switch (method) {
case "GET":
// 处理GET请求
break;
case "POST":
// 处理POST请求
break;
// 其他方法...
default:
exchange.sendResponseHeaders(405, -1); // Method Not Allowed
}
}
可以设置自定义的响应头和状态码,以实现更丰富的 HTTP 响应
@Override
public void handle(HttpExchange exchange) throws IOException {
String response = "Custom Header Response";
exchange.getResponseHeaders().add("Content-Type", "text/plain");
exchange.getResponseHeaders().add("X-Custom-Header", "MyHeaderValue");
exchange.sendResponseHeaders(200, response.getBytes().length);
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
值得注意的是,虽然使用 HttpServer
创建服务器简单,但在生产环境中通常建议使用成熟的框架(如Spring Boot)或专门的服务器(如Tomcat、Jetty)来处理更复杂的需求,如高并发、安全性和扩展性等
接下来正式进入 Java Web 的世界吧~