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/