仅使用 Java SE API 的 Java 简单 HTTP 服务器

2024-02-08

有没有一种方法可以仅使用 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 https://docs.oracle.com/en/java/javase/17/docs/api/jdk.httpserver/module-summary.html. The com.sun.net.httpserver包摘要 https://docs.oracle.com/en/java/javase/17/docs/api/jdk.httpserver/com/sun/net/httpserver/package-summary.html概述了所涉及的类并包含示例。

Here's a kickoff example copypasted from their docs. You can just copy'n'paste'n'run it on Java 6+.
(to all people trying to edit it nonetheless, because it's an ugly piece of code, please don't, this is a copy paste, not mine, moreover you should never edit quotations unless they have changed in the original source)

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()方法必须显式指定您然后在响应标头中指定的字符集。唉,虽然误导了初学者,但这毕竟只是一个基本的启动示例。

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

这是回应


至于使用com.sun.*类,请注意,与一些开发人员的想法相反,众所周知的常见问题解答绝对没有禁止这样做为什么开发人员不应该编写调用“sun”包的程序 https://www.oracle.com/java/technologies/faq-sun-packages.html。该常见问题解答涉及sun.*包(例如sun.misc.BASE64Encoder)供 Oracle JRE 内部使用(因此,当您在不同的 JRE 上运行应用程序时,这会杀死您的应用程序),而不是com.sun.*包裹。 Sun/Oracle 也只是在 Java SE API 本身之上开发软件,就像 Apache 等其他公司一样。而且,这个具体HttpServer必须存在于每个 JDK 中,因此绝对不会出现像 JDK 那样的“可移植性”问题sun.*包裹。使用com.sun.*课程只是灰心(但不是禁止的)当涉及到执行某些Java API,例如GlassFish(Java EE impl)、Mojarra(JSF impl)、Jersey(JAX-RS impl)等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅使用 Java SE API 的 Java 简单 HTTP 服务器 的相关文章

  • 减少1000张图片的HTTP请求?

    我知道这个问题可能听起来有点疯狂 但我想也许有人会想出一个聪明的主意 假设您在一个 HTML 页面上有 1000 个缩略图 图像大小约为5 10 kb 有没有办法在单个请求中加载所有图像 以某种方式将所有图像压缩到一个文件中 或者您对该主题
  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • 使用 Google OAuth2.0 时出现错误请求

    从 Salesforce 中使用 Google OAuth 时 我收到 400 错误请求 以下错误与无效的 grant type 有关 但如果您查看 使用刷新令牌 下的文档 您会发现它是正确的 https developers google
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • 从 eclipse 运行时 java.io.FileNotFoundException: (没有这样的文件或目录)

    我正在写入文件并想要控制台输出 TODO Create a game engine and call the runGame method public static void main String args throws Excepti
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Spring 中设置 WS https 调用超时 (HttpsUrlConnectionMessageSender)

    我正在尝试为 WS 调用设置超时 我延长了WebServiceGatewaySupport并尝试将发送者超时设置为如下 public Object marshalSendAndReceive Object requestPayload We
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • Java String.format 向整数添加空格

    我有一小段代码 我不明白输出 此输出向我的字符串格式文本添加空格 我做错了什么吗 public class HelloWorld public static void main String args int a1 540 int a2 4
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • Java泛型类型

    当我有一个界面时 public interface Foo

随机推荐

  • CSS滚动条样式跨浏览器[重复]

    这个问题在这里已经有答案了 如何定义跨浏览器的 CSS 滚动条样式 我测试了这段代码 它只在 IE 和 Opera 中有效 但在 Chrome Safari 和 Firefox 中失败
  • 使用动态列和列名称进行逆透视

    我正在尝试取消透视具有大量列的表 其格式为 PID UID col1 col2 col3 下面的动态 SQL 将为我提供除列名之外的几乎所有内容 目标是使用逆透视值源自的列的名称填充 ID 字段 Build list of cols we
  • 在datagridview中如何使用复选框作为单选按钮?

    IDE Visual Studio c Winforms 应用程序 我投入了大约12个小时 但没有取得成功 作为DataGridView不提供单选按钮类型的单元格 所以我尝试使用复选框单元格作为单选按钮功能 即我只想选中一列中的一个复选框
  • 在 C# 中使用 XDocument 创建 XML 文件

    我有一个List
  • 无需登录即可在系统启动时启动应用程序

    我们有一个新的服务器正在运行 并且我们有一些新的程序执行导入例程 到目前为止一切顺利 但是有一个程序被放入自动启动文件夹 So 在管理员登录之前它不会运行 如果我们注销它就会停止 我想将其放入一个单独的会话中 这样它就可以在没有任何交互的情
  • 在弹性搜索中索引包含数学表达式的文档的最佳方法是什么?

    我试图解决的问题是我有一堆与数学表达式 公式相关的文档 我想通过公式或表达式搜索文档 到目前为止 根据我的研究 我正在考虑将数学表达式转换为乳胶格式并作为字符串存储在数据库中 弹性搜索 通过这种方法 我可以搜索带有乳胶字符串的文档吗 a2
  • 想知道 libusb_bulk_transfer 错误代码

    libusb open device deviceHandle 返回 0 but libusb bulk transfer deviceHandle 0x81 data1 512 len 0 返回 5 所以我尝试找出错误code 5 usi
  • IE替代window.stop()(取消所有挂起的请求)

    我正在寻找 IE 的 window stop 的替代方案 我尝试过 document execCommand Stop 但它似乎不起作用 我试图取消从我正在使用的 ASP 用户控件中调用的 XMLHttpRequest 我无法使用 jQue
  • 致命:无法访问私钥文件“/etc/ssl/private/ssl-cert-snakeoil.key”:权限被拒绝

    我相信我最终混淆了 etc ssl 目录树的权限 因为最后一次修改是在 11 月 18 日以及我无法让 PostgreSQL 工作的第二天进行的 当我输入时 sudo 服务 postgresql 启动 I get 致命 无法访问私钥文件 e
  • Android:在嵌套在垂直线性布局中的水平线性布局中的文本视图之间放置垂直分隔线/分隔线?

    对于 android 内容视图 我有一个垂直线性布局 其中有一些文本视图 其中有一些线来划分和分隔垂直元素 这工作正常 xml 如下
  • celerybeat相对于cron有什么优势?

    我看到很多人更喜欢 celerybeat 而不是 cron jobs 来执行定期任务 我看到了 celerybeat 的文档 并且可以看到有关如何使用它的信息 但没有看到为什么 或何时 我应该更喜欢它而不是 cronjobs http do
  • html 中如何使用 iframe?

    什么是 iframe 它在 html 中如何使用 iframe 是一个允许您在 HTML 页面中嵌入外部内容的对象 您可以使用它来显示其他网页 文档 例如 PDF 等 尽管对于复杂的媒体类型 您可能想尝试使用对象标签 您可以将 iframe
  • 仅使用 Flutter 在本地环境中托管 Web 服务器

    是否可以使用基于 Flutter 桌面的应用程序在本地环境中托管 Flutter Web 应用程序 在谷歌上搜索这样的解决方案可能很困难 因为它涉及许多导致类似情况的关键字 当您需要本地解决方案时需要在线托管 仅命令行解决方案等 经过一番挖
  • 如何访问通讯录中当前用户的记录?

    地址簿 API 中有没有办法以编程方式访问当前用户的记录 也就是说 如果这部iPhone是John Smith的 那么要获取John Smith的联系人记录 以通讯录中标记为 我 的记录为准 显然 您可以弹出选择器并让用户从其联系人中选择自
  • 使用数据库表作为 JMeter 的 CSV 数据集

    我目前正在使用 JMeter 对我公司的一个应用程序进行性能测试 该应用程序需要登录 我必须使用多个用户 在 JMeter 中通常完成此操作的方式似乎是通过 CSV 数据集 但是我可以访问数据库并可以直接从那里读取所有凭据 由于这是一个测试
  • jQuery - 选择输入字段的关联标签元素[重复]

    这个问题在这里已经有答案了 我有一组输入字段 其中一些具有关联的标签 有些没有
  • 如何减小 SSRS PDF 导出大小

    我有一份导出为 PDF 的 SSRS 报告 该报告有一张表 其中有 2 行 没有格式的标题和一条记录 创建的 PDF 导出大小为 130K 我确信这比它需要的要大得多 有什么方法可以减小 SSRS 创建的 PDF 的大小吗 或者我应该注意任
  • 如何在 iPhone/Objective C 上找出 RSA 公钥的模数和指数

    有没有可能的方法来找出使用 SecKeyGeneratePair 一般的安全框架 创建的公钥的模数和指数 我对此很困惑 但这是我找到的解决方案 不使用任何外部包 首先 转到 Apple 的 CryptoExercise 示例 从那里下载 S
  • 如何将聚类标签与 Matlab 中的“真实值”标签相匹配

    我在这里搜索并用谷歌搜索 但没有结果 在 Weka 中进行聚类时 有一个方便的选项 即类到聚类 它与算法生成的聚类相匹配 例如简单的 k means 到您作为类属性提供的 基本事实 类标签 这样我们就可以看到聚类准确率 错误百分比 现在 我
  • 仅使用 Java SE API 的 Java 简单 HTTP 服务器

    有没有一种方法可以仅使用 Java SE API 在 Java 中创建一个非常基本的 HTTP 服务器 仅支持 GET POST 而无需编写代码来手动解析 HTTP 请求并手动格式化 HTTP 响应 Java SE API 很好地封装了 H