HTTP server infrastructure/framework is very simple to implement and is bundled only with the Oracle JDK 1.6. Following are the main classes:
See this link for sun.* package discussions.
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.URLDecoder; import java.util.List; import java.util.concurrent.Executors; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class JavaServer { public static final String nl = System.getProperty("line.separator"); public static void main(String[] args) throws Exception { if(args.length != 2) { printUsage(); System.exit(-1); } String strPort = null; String strAddress = null; for (int i = 0; i < args.length; i++) { if(args[i].startsWith("-p")){ strPort = args[i].substring(2, args[i].length()).trim(); }else if(args[i].startsWith("-a")){ strAddress = args[i].substring(2, args[i].length()).trim(); }else throw new IllegalArgumentException("Unknown command '" + args[i]+ "'"); } if(strAddress.length() == 0 || strPort.length() == 0) throw new IllegalArgumentException("Port = " + strPort + ", IP = " + strAddress); int port = Integer.parseInt(strPort); InetSocketAddress address = new InetSocketAddress(strAddress, port); System.out.println("Going to run server on '" + address + "'"); new JavaServer().start(address); } private static void printUsage() { System.out.println("$JavaServer -p<Port> -a<IP Address>"); } private HttpServer server; public void start(InetSocketAddress address) throws IOException { server = HttpServer.create(address, 0); server.setExecutor(Executors.newCachedThreadPool()); server.createContext("/", new RootHandler()); server.start(); } } class RootHandler implements HttpHandler { private static final int BUFFER_SIZE = 1024; public void handle(HttpExchange exchange) throws IOException { String method = exchange.getRequestMethod(); if(method.equalsIgnoreCase("get")) { String request = ""; ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFFER_SIZE); InputStream is = exchange.getRequestBody(); byte[] buff = new byte[BUFFER_SIZE]; while (true) { int out = is.read(buff); if(out == -1) break; baos.write(buff, 0, out); } is.close(); if (baos.size() > 0) { request = URLDecoder.decode(baos.toByteArray().toString(), "UTF-8"); } else { request = null; } StringBuilder buf = new StringBuilder(); buf.append("<html><head><title>Simple HTTP Server !!</title></head><body>"); buf.append("<p><pre>"); buf.append(exchange.getRequestMethod() + " " + exchange.getRequestURI() + " " + exchange.getProtocol() + JavaServer.nl); Headers headers = exchange.getRequestHeaders(); for (String name : headers.keySet()) { List<String> values = headers.get(name); for (String value : values) { buf.append(name + " --> " + value + JavaServer.nl); } } if (request != null) { buf.append(JavaServer.nl); buf.append(request); } buf.append("</pre></p>"); buf.append("</body></html>\n"); String response = buf.toString(); Headers responseHeaders = exchange.getResponseHeaders(); responseHeaders.set("Content-Type", "text/html"); exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length()); OutputStream res = exchange.getResponseBody(); res.write(response.getBytes()); res.close(); }else { String response = "Bad request method !!"; exchange.sendResponseHeaders(HttpURLConnection.HTTP_BAD_METHOD, response.length()); OutputStream res = exchange.getResponseBody(); res.write(response.getBytes()); res.close(); } exchange.close(); } }
Steps to run the above code
- Compile it using Oracle JDK 1.6
- Then execute this command on console (without quotes) 'Java JavaServer -p<port number> -a<ipaddress or localhost>' . For example, java JavaServer -p5463 -a127.0.0.1
- Open your browser and type the URL. For example, http://127.0.0.1:5463/