0

我正在尝试使用 Java 构建一个简单的 HTTP 服务器,使用

java.net.ServerSocket = new ServerSocket(this.port, 0, this.ip);
java.net.Socket connection = null;
connection = server.accept();
java.io.OutputStream out = new BufferedOutputStream(connection.getOutputStream());

使用网络浏览器连接时,我只是从字符串中写入输出(HTTP 标头 + html 代码)

String headers = "http headers";
String response = "this is the response";
out.write(headers.getBytes());
out.write(response.getBytes());
out.flush();
connection.close();

并且浏览器正确显示它。

现在我的问题是,我想构建一个完整的网页(html、javascript、css、图像)并将这些文件放入 Java 包 (JAR) 文件中,当然,这些文件设计为以后不可修改JAR 可以使用了。这是问题:

  1. 如何做到这一点?将文件存储在 JAR 中,然后在建立连接时输出它们。

  2. 如何输出图像文件(非文本)就像输出String一样out.write()

谢谢,任何示例或代码表示赞赏。

4

3 回答 3

0

只要它不是家务,我就不会尝试重新发明轮子并开发另一个 Web 服务器。有一个小型嵌入式 Java Web 服务器可用于该目的。

例如,我曾多次使用Tiny Java Web Server 和 Servlet Container

如果您已将它集成到您​​的应用程序中,您可以实现一个新的 javax.servlet.http.HttpServlet,它从 JAR 文件的资源中读取文件。正如 Tomasz Nurkiewicz 已经指出的那样,可以加载内容getClass().getRourceAsStream(...)

于 2011-11-20T15:19:57.803 回答
0

要使用 JAR 文件,请使用 JarOutputStream 或 ZipOutputStream。要输出二进制数据,不要用 Writer 包装输出流。write(byte)OutputStream 知道使用方法和写入字节write(byte[])

这里唯一的问题是“你为什么要自己开发 HTTP 服务器?”

于 2011-11-20T15:16:36.907 回答
0

实现 HTTP 服务器是您的主要问题还是只是实现其他目标的一种方式?如果是后者,请考虑嵌入 Tomcat 或 Jetty,这要简单得多并使用标准的 servlet API。

回到你的问题:JAR 只是一个 ZIP 文件,你可以在那里放任何东西,包括文件、图像、电影等。如果你把一个文件放在一个 JAR 文件中,你可以很容易地加载它:

InputStream is = getClass().getResourceAsStream("/dir/file.png");

有关如何工作的详细信息,请参阅这些问题getResourceAsStream()

关于你的第二个问题:当你有一个InputStream实例时,你可以逐字节读取它并复制到 target out OutputStream。当然还有更好、更安全、更快的方法,但这超出了这个问题的范围。看看IOUtils.copy()

IOUtils.copy(is, out);

关于您的代码的最后一个提示:如果您发送Strings ,请考虑OutputStreamWriter哪些PrintWriterAPI 更简单。

于 2011-11-20T15:18:31.197 回答