java - Java 中的简单 HTTP 服务器,仅使用 Java SE API

标签 java http httpserver

有没有办法只使用 Java SE API 在 Java 中创建一个非常基本的 HTTP 服务器(仅支持 GET/POST),而无需编写代码来手动解析 HTTP 请求和手动格式化 HTTP 响应? Java SE API 很好地将 HTTP 客户端功能封装在 HttpURLConnection 中,但是有没有类似的 HTTP 服务器功能?

需要明确的是,我在网上看到的很多 ServerSocket 示例的问题是它们自己进行请求解析/响应格式化和错误处理,这很乏味,错误- 容易出现,而且不太可能是全面的,出于这些原因,我试图避免它。

最佳答案

从 Java SE 6 开始,Sun Oracle JRE 中有一个内置的 HTTP 服务器。 Java 9 模块名称是 jdk.httpserver . com.sun.net.httpserver package summary概述了所涉及的类并包含示例。

这是他们文档中的一个启动示例copypasted。您可以在 Java 6+ 上复制“粘贴”并运行它。
(对于所有试图编辑它的人,因为它是一段丑陋的代码,请不要,这是复制粘贴,不是我的,而且你不应该编辑引用,除非它们在原始来源)

package com.stackoverflow.q3732109;

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

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Test {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

}

注意应该是他们示例中的 response.length() 部分不好,应该是 response.getBytes().length。即使这样,getBytes() 方法也必须显式指定您随后在响应 header 中指定的字符集。唉,虽然对初学者有误导,但这毕竟只是一个基本的启动示例。

执行它并转到http://localhost:8000/test,您将看到以下响应:

This is the response


至于使用 com.sun.* 类,请注意,与某些开发人员的想法相反,众所周知的常见问题解答 Why Developers Should Not Write Programs That Call 'sun' Packages 绝对不禁止这样做。 .该常见问题解答涉及供 Oracle JRE 内部使用的 sun.* 包(例如 sun.misc.BASE64Encoder)(因此,当您在其上运行应用程序时,它会杀死您的应用程序)不同的 JRE),而不是 com.sun.* 包。 Sun/Oracle 也只是像 Apache 等其他公司一样,自己在 Java SE API 之上开发软件。此外,这个特定的 HttpServer 必须存在于每个 JDK 中,因此绝对不会出现像 sun.* 包那样的“可移植性”问题。使用 com.sun.* 类只是不鼓励(但不是禁止)当它涉及到一个实现某些 Java API,例如 GlassFish (Java EE impl)、Mojarra (JSF impl)、Jersey (JAX-RS impl) 等。

关于java - Java 中的简单 HTTP 服务器,仅使用 Java SE API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3732109/

相关文章:

python - HTTP 方法分类取消与删除

c - 我写了一个简单的 http 服务器,似乎可以工作,但在尝试通过浏览器访问时遇到问题

java - 操作栏中缺少搜索操作项

java - 尽管有默认的 "OR"谓词,但 ViewerFilter 上的 "And"谓词?

php - PHP 可以检测它已经或准备发送到浏览器的状态代码吗?

c# - HttpWebRequest 和 Tomcat

java - SWT 下拉菜单按钮视觉故障

java - Phantasia4(Java 客户端和 C 服务器)套接字超时

python-3.x - 从 Python 的 http.server 提供文件 - 使用文件正确响应

c++ - 如何使用 QTcp-Server 套接字创建 HTTP MJPEG 流媒体服务器?