我正在尝试使用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,images)并将这些文件放入Java包(JAR)文件中,当然,这些文件的设计不是 - 在JAR准备好使用之后进行修改。以下是问题:
如何实现这一目标?将文件存储在JAR中,然后在建立连接时输出它们。
如何输出图片文件(非文字),就像String
输出out.write()
一样?
谢谢,感谢任何样本或代码。
答案 0 :(得分:0)
要使用JAR文件,请使用JarOutputStream或ZipOutputStream。要输出二进制数据,请不要使用Writer包装输出流。 OuputStream知道使用方法write(byte)
和write(byte[])
写入字节。
这里唯一的问题是“你为什么要自己开发HTTP服务器?”
答案 1 :(得分:0)
实施HTTP服务器是您的主要问题还是实现其他目标的方法?如果是后者,请考虑嵌入Tomcat或Jetty,使用标准的servlet API更简单。
回到你的问题:JAR只是一个ZIP文件,你可以放任何东西,包括文件,图像,电影等。如果你把文件放在一个JAR文件中,你可以用以下方法轻松加载:
InputStream is = getClass().getResourceAsStream("/dir/file.png");
请参阅以下问题,详细了解getResourceAsStream()
的工作原理:
关于第二个问题:当您拥有InputStream
个实例时,您可以逐个字节地读取它并复制到目标out
OutputStream
。当然,有更好,更安全,更快捷的方式,但这超出了这个问题的范围。只需查看IOUtils.copy():
IOUtils.copy(is, out);
关于您的代码的最后提示:如果您要发送String
,请考虑OutputStreamWriter
和PrintWriter
哪些API更容易。
答案 2 :(得分:0)
只要它不是家务,我就不会尝试重新发明轮子并开发另一个Web服务器。有一个小的嵌入式Java Web服务器可用于此目的。
例如,我有几次使用Tiny Java Web Server and Servlet Container。
如果已将其集成到应用程序中,则可以实现一个新的javax.servlet.http.HttpServlet,它从JAR文件的资源中读取文件。内容可以加载为Tomasz Nurkiewicz已经指出getClass().getRourceAsStream(...)
。