当前位置: 首页 > 面试题库 >

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

戚正业
2023-03-14
问题内容

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

需要明确指出的是,我在网上看到的许多ServerSocket示例存在的问题是它们执行自己的请求解析/响应格式和错误处理,这很繁琐,容易出错,而且不太可能全面,由于这些原因,我正努力避免这种情况。

作为我要避免的手动HTTP操作的示例:

http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html


问题答案:

从Java SE 6开始,Sun Oracle JRE中内置了HTTP服务器。该com.sun.net.httpserver包的摘要概述了参与类和包含的例子。

这是一个从他们的文档中复制的启动示例(不过,所有尝试编辑它的人,因为它是一段丑陋的代码,请不要这样做,这是一个复制粘贴,不是我的,此外,除非更改了它们,否则切勿编辑引号在原始来源中)。你可以只复制’n’paste’n’在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()方法也必须显式指定字符集,然后在响应头中指定该字符集。las,尽管误导了初学者,但这毕竟只是一个基本的启动示例。

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

这是回应

关于使用com.sun.*类,请注意,这与某些开发人员的看法相反,众所周知的FAQ 为什么开发人员不应编写调用“ sun”程序包的程序绝对不禁止这样做。该FAQ 与Oracle JRE内部使用的sun.*软件包(例如sun.misc.BASE64Encoder)有关(因此,当你在其他JRE上运行应用程序时,它会杀死你的应用程序),而不是com.sun.*软件包。Sun / Oracle像其他公司(例如Apache等)一样,也只是在Java SE API之上自己开发软件。com.sun.*仅在涉及某个Java API 的实现(例如GlassFish(Java EE impl),Mojarra(JSF impl),Jersey(JAX-RS impl)等)时,才鼓励(但不禁止)使用类。



 类似资料:
  • 问题内容: 我目前正在创建一个返回静态页面的小型HTTP服务器…我尝试使用Java套接字: 该代码不包含任何错误,我从浏览器得到了如下响应: 但是我的问题是浏览器没有页面?有什么帮助吗? PS:我已经读过这篇文章:http : //en.wikipedia.org/wiki/Hypertext_Transfer_Protocol,(对不起法语,…) 问题答案: 除了每个请求标头行之后,您还必须在标

  • 本文向大家介绍超简单的Python HTTP服务,包括了超简单的Python HTTP服务的使用技巧和注意事项,需要的朋友参考一下 超如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等。那么, Python 可能帮助你。使用Python可以完成一个简单的内建 HTTP 服务器。于是,你可以把你的目录和文件都以HTTP的方式展示出

  • 本文向大家介绍C++实现简单的HTTP服务器,包括了C++实现简单的HTTP服务器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现HTTP服务器的相关代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 我想用Java创建一个非常简单的HTTP服务器应用程序。 例如,如果我在localhost端口8080上运行服务器,并且从浏览器发出以下调用,我希望获得一个带有字符串“hello world!”的Json数组: 我希望在服务器中有类似这样的东西(非常抽象的代码): 我想这个函数实际上不应该“返回”json,而是使用某种HTTP响应处理程序或类似的东西发送它... 最简单的方法是什么,而不需要熟悉许

  • 问题内容: 有谁知道将Java方法发布为Web服务的非常简单的方法?我真的不想要使用Tomcat或Jetty或任何其他容器框架的开销。 方案:我想从本地LAN上的其他计算机访问服务类型应用程序中的一组Java方法。 问题答案: 好吧,Tomcat或Jetty对于将某些方法发布为Web服务可能是过大的。但是另一方面,它并不太复杂,他们可以完成工作,那么为什么不呢? 不久前我遇到了类似的问题,并将To

  • 问题内容: 我正在尝试编写一个简单的Java http客户端,该客户端仅打印出服务器响应的一行。我的问题是服务器没有响应。这是我所拥有的,正在编译并且没有明显错误地运行,只是在键入主机名(例如“ www.google.com”)后挂起: 有什么建议?请注意,这假设存在一个“ index.html”-即使为true,它仍会挂起。 问题答案: 我认为我可以通过对代码进行少量更改来重现该问题,因此现在它