Question

I'm trying to build a simple HTTP Server using Java, using

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());

when connected using web browser, i'm simply write the output (HTTP headers + html code) from a string

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

and the browser display it correctly.

And now my problem is, i want to construct a full webpage (html, javascript, css, images) and put those files into the Java package (JAR) file, and of course, those files are designed not-to-be modified after the JAR is ready to use. And here's the questions:

  1. how to achieve this? storing the files inside the JAR and then output them when a connection is made.

  2. how output images file (non-text) just like output-ing String by out.write() ?

Thanks, any sample or code is appreciated.

Was it helpful?

Solution

Is implementing an HTTP server your primary problem or just a way to achieve some other goal? If the latter, consider embedding Tomcat or Jetty, much simpler and with standard servlet API.

Back to your question: JAR is just a ZIP file, you can put anything there, including files, images, movies, etc. If you place a file inside a JAR file you can load it easily with:

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

See these questions for details how getResourceAsStream() works:

About your second question: when you have an InputStream instance you can just read it byte-by-byte and copy to target out OutputStream. Of course there are better, safer and faster ways, but that's beyond the scope of this question. Just have a look at IOUtils.copy():

IOUtils.copy(is, out);

And the last hint concerning your code: if you are sending Strings , consider OutputStreamWriter and PrintWriter which have easier API.

OTHER TIPS

To work with JAR files use JarOutputStream or ZipOutputStream. To output binary data just do not wrap your output stream with Writer. OuputStream knows to write bytes using method write(byte) and write(byte[]).

The only question here is "Why are you developing HTTP server yourself?"

As long as it is not a housework I would not try to reinvent the wheel and develop another web server. There a small embedded Java web-servers available which can be used for that purpose.

I have for example use the Tiny Java Web Server and Servlet Container several times.

If you have integrated it into your application you can implement a new javax.servlet.http.HttpServlet that reads the files from the resources of your JAR file. The content can be loaded as Tomasz Nurkiewicz already pointed out getClass().getRourceAsStream(...).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top