仅使用Java SE API的Java中的简单HTTP服务器
有没有一种方法可以仅使用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)等)时,才鼓励(但不禁止)使用类。
以上是 仅使用Java SE API的Java中的简单HTTP服务器 的全部内容, 来源链接: utcz.com/qa/424782.html