Java tutorial
/* $Id: SimpleHttpServer.java 124 2010-09-23 16:25:36Z altdotua@gmail.com $ */ //package djudge.utils; import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; import java.io.InputStreamReader; import java.io.BufferedReader; interface SimpleHttpServerDataProvider { public String getHtmlPage(String query); } public class SimpleHttpServer { final SimpleHttpServerDataProvider dataProvider; public SimpleHttpServer(SimpleHttpServerDataProvider dataProvider, int port) { class SocketProcessor implements Runnable { private Socket s; private InputStream is; private OutputStream os; private SimpleHttpServerDataProvider dataProvider; private SocketProcessor(Socket s, SimpleHttpServerDataProvider prov) throws Throwable { this.dataProvider = prov; this.s = s; this.is = s.getInputStream(); this.os = s.getOutputStream(); } public void run() { try { readInputHeaders(); writeResponse(""); } catch (Throwable t) { /*do nothing*/ } finally { try { s.close(); } catch (Throwable t) { /*do nothing*/ } } } private void writeResponse(String s) throws Throwable { String response = "HTTP/1.1 200 OK\r\n" + "Server: DJudge.http\r\n" + "Content-Type: text/html\r\n" + "Content-Length: " + s.length() + "\r\n" + "Connection: close\r\n\r\n"; String result = response + dataProvider.getHtmlPage(""); os.write(result.getBytes()); os.flush(); } private void readInputHeaders() throws Throwable { BufferedReader br = new BufferedReader(new InputStreamReader(is)); while (true) { String s = br.readLine(); if (s == null || s.trim().length() == 0) { break; } } } } this.dataProvider = dataProvider; try { ServerSocket ss = new ServerSocket(port); while (true) { Socket s = ss.accept(); new Thread(new SocketProcessor(s, dataProvider)).start(); } } catch (Exception e) { } catch (Throwable e) { } } }