javahttpserver详解

JavaHttpServer是一个轻量级的Java HTTP服务器实现。它提供了高可靠性、高性能、高扩展性的Web应用柿子,完全可以替代一些商业Http服务器。

一、基本概念

JavaHttpServer是一个基于Java语言开发的轻量级Http服务器,是JavaSE(标准版)中自带的网络服务组件,无需安装额外的插件或框架。它仅依赖于JRE,开发者可以直接调用Java标准API进行开发,是一种非常方便的开发工具。

JavaHttpServer在Java SE 6中引入,可以处理HTTP/1.1请求,支持静态和动态生成内容,并支持SSL加密。它支持多种HTTP方法,如GET、POST、PUT、DELETE,支持Cookie、Session、缓存、压缩、安全认证等功能。JavaHttpServer还提供了一组API,使得开发者可以方便地扩展JavaHttpServer,按照需求实现自己的Http服务。

二、使用方法

使用JavaHttpServer来开发一个Web应用程序是非常简单的,以下是一个简单的例子:

import com.sun.net.httpserver.*;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class MyHttpServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(null);
        server.start();
    }

    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange exchange) throws IOException {
            String response = "Hello World!";
            exchange.sendResponseHeaders(200, response.length());
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

在该例子中,代码通过HttpServer对象创建了一个本地服务器并监听8000端口。然后通过server.createContext()方法添加一个处理器MyHandler,根据用户请求返回“Hello World!”。

三、主要功能

1. 路由和处理器

JavaHttpServer允许开发者通过注册处理器来处理来自客户端的请求,并将它们路由到正确的处理器。开发者可以使用HttpExchange对象来处理请求、响应数据和设置HTTP头信息。以下代码是一个使用基本路由和处理器的例子:

// 创建HttpServer,并命名它为server
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

// 创建上下文和处理器
server.createContext("/users", new UsersHandler());
server.createContext("/products", new ProductsHandler());

// 启动服务器
server.start();

// 处理器UsersHandler
static class UsersHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        // 处理users路由
    }
}

// 处理器ProductsHandler
static class ProductsHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        // 处理products路由
    }
}

2. 静态文件服务

JavaHttpServer也允许开发者通过添加静态文件处理器来服务于静态文件。以下是创建一个简单的静态文件处理器的例子:

// 创建静态文件处理器对象
HttpHandler staticHandler = new StaticFileHandler();

// 创建HttpServer,并为根路由添加静态文件处理器
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/", staticHandler);

// 启动服务器
server.start();

// 处理静态文件的处理器
static class StaticFileHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        String path = exchange.getRequestURI().getPath().substring(1);

        if ("".equals(path)) {
            path = "index.html";
        }

        InputStream stream = getClass().getResourceAsStream(path);

        if (stream != null) {
            byte[] bytes = IOUtils.toByteArray(stream);
            exchange.sendResponseHeaders(200, bytes.length);
            exchange.getResponseBody().write(bytes);
            exchange.close();
        } else {
            exchange.sendResponseHeaders(404, 0);
            exchange.close();
        }
    }
}

3. Cookie

JavaHttpServer能够支持HTTP状态管理,包括Cookies。开发者可以通过以下方法设置Cookie:

HttpExchange exchange = ...;
HttpHeaders headers = exchange.getResponseHeaders();

headers.add("Set-Cookie", "name=value; Domain=domain.com; Max-Age=1000; Path=/");

// 获取Cookie
List cookies = headers.get("Cookie");

4. SSL

JavaHttpServer支持加密协议,并包含了SSL支持。以下是一个使用JavaHttpServer启用SSL的例子:

// 实例化SSLContext
char[] password = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("keystore.jks");
ks.load(fis, password);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);

TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

// 启用SSL
HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(8000), 0);
httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
httpsServer.start();

5. 缓存和压缩

JavaHttpServer能够缓存静态资源,同时提供压缩机制。以下是一个使用JavaHttpServer缓存和压缩的例子:

// 创建HttpServer,并启动gzip压缩和缓存
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

GzipFilter gzipFilter = new GzipFilter();
server.createContext("/static/", new StaticHandler());
server.createContext("/", new DynamicHandler());
server.setExecutor(null);
server.start();

// 静态资源的处理器
static class StaticHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        File file = new File("static", exchange.getRequestURI().toString().substring(8));

        if (file.exists()) {
            byte[] bytes = Files.readAllBytes(file.toPath());
            Headers headers = exchange.getResponseHeaders();

            // 启用gzip压缩
            headers.add("Content-Encoding", "gzip");
            // 启用缓存(缓存1分钟)
            headers.add("Cache-Control", "max-age=60");

            // 压缩文件并返回
            OutputStream os = new GZIPOutputStream(exchange.getResponseBody());
            os.write(bytes);
            os.close();
            exchange.close();
        } else {
            exchange.sendResponseHeaders(404, 0);
            exchange.close();
        }
    }
}

// 动态资源的处理器
static class DynamicHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        Headers headers = exchange.getResponseHeaders();

        // 启用缓存(缓存1分钟)
        headers.add("Cache-Control", "max-age=60");

        String response = "Hello World!";

        exchange.sendResponseHeaders(200, response.length());
        OutputStream os = exchange.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }
}

原创文章,作者:SYAVN,如若转载,请注明出处:https://www.506064.com/n/324607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SYAVN的头像SYAVN
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25

发表回复

登录后才能评论