使用Java创建一个简单的HTTP服务器?

68

用Java创建简单的HTTP服务器最简单的方法是什么?commons中是否有任何库可以方便此操作?我只需对GET/POST做出响应,且不能使用应用服务器。

实现这个的最简单方法是什么?


这个线程提供了一个例子,其中使用了本地的Java库。 - Masoud Valafar
这里放置了有关如何使用Jetty的博客。https://wxg-blog.blogspot.com/2019/08/javahow-to-use-jetty-build-simple-http.html - Guokas
13个回答

47

使用Jetty。这里是嵌入Jetty的官方示例。(这里是一个过时的教程。)

Jetty相当轻巧,但确实提供了servlet容器,这可能与您反对使用“应用服务器”的要求相矛盾。

您可以将Jetty服务器嵌入到您的应用程序中。Jetty允许嵌入式或servlet容器选项。

这里还有一个更快速的入门指南以及源代码


3
不使用“应用服务器”的意思仅限于不在其下运行。这句话很好地概括了这一点:“不要将你的应用部署在Jetty中,而是在你的应用中部署Jetty”。 - Stefan Kendall
自2012年以来(顺便说一下,那已经是7年前了),Jetty在嵌入式模式下上传文件变得非常困难。我没有找到一个单一的可行的使用嵌入式Jetty进行文件上传的例子。除非你想要使用另一种技术来提供静态文件。此外,Jetty文档质量较差。 - Dr Deo

36
这是我会处理这个问题的方式:
  1. 启动一个监听ServerSocket(可能在端口80上)。
  2. 一旦您获得连接请求,请接受并传递给另一个线程/进程(这将使您的ServerSocket可用以继续监听并接受其他连接)。
  3. 解析请求文本(特别是标题,您将看到它是GET还是POST,以及传递的参数)。
  4. 使用您自己的标题(Content-Type等)和HTML进行回复。
我发现使用Firebug(在Firefox中)查看标题示例很有用。这是您要模仿的内容。
尝试此链接: - Java中的多线程服务器

1
@relgukxilef 确实。我更新到了一个内容类似的不同网站。原始链接仍然可以在Wayback Machine上找到 - Philippe Signoret
这应该是被接受的答案,因为关于Jetty的回答与不使用应用服务器的要求直接冲突。ServerSocket就是最简单的解决方案。 - Kallaste
使用Session,我们需要使用Java EE servlets API吗? - R Sun

22

最简单的是 Simple ,这里有一个教程,没有WEB-INF、Servlet API和依赖项。只需使用一个简单的轻量级HTTP服务器即可在单个JAR包中完成。


4
有大量的源文件,我只需要一个十行的程序。它在哪里? - WestCoastProjects

8

这是Java 6运行时,早期版本没有随附它。 - Thorbjørn Ravn Andersen
自Java 8起,默认情况下被阻止,您可以通过接受此处的批准响应来允许访问库https://dev59.com/f2Ys5IYBdhLWcg3wFP54。 - Sfp

4

我很惊讶这个例子不在这里:

http://hc.apache.org/httpcomponents-core-ga/httpcore/examples/org/apache/http/examples/ElementalHttpServer.java

编辑 >> 上述链接无法访问。以下是POST示例摘录,后跟HTTP示例链接。

 if (!conn.isOpen()) {
        Socket socket = new Socket(host.getHostName(), host.getPort());
        conn.bind(socket);
    }
    BasicHttpEntityEnclosingRequest request = new
    BasicHttpEntityEnclosingRequest("POST",
    "/servlets‐examples/servlet/RequestInfoExample");
    request.setEntity(requestBodies[i]);
    System.out.println(">> Request URI: " + request.getRequestLine().getUri());
    httpexecutor.preProcess(request, httpproc, coreContext);
    HttpResponse response = httpexecutor.execute(request, conn, coreContext);
    httpexecutor.postProcess(response, httpproc, coreContext);
    System.out.println("<< Response: " + response.getStatusLine());
    System.out.println(EntityUtils.toString(response.getEntity()));
    System.out.println("==============");
    if (!connStrategy.keepAlive(response, coreContext)) {
    conn.close();
    } else {
    System.out.println("Connection kept alive...");
    }

http://hc.apache.org/httpcomponents-core-ga/httpcore/examples/org/apache/http/examples/


4

3

1
我已经实现了一个链接
注:为了处理json,我使用了jackson。如果你需要的话,也可以删除它。

1

Jetty 是一种非常方便嵌入 HTTP 服务器的好方法。它支持自己的简单方式来附加处理程序,并且如果您需要更多功能,它还是一个完整的 J2EE 应用服务器。


1

嵌入Tomcat相对来说是相当容易的,就像这样的事情一样。这里有一个关于此的很好的StackOverflow参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接