import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

import java.net.HttpURLConnection;
import java.net.InetSocketAddress;

import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

import java.lang.reflect.Field;

import java.util.List;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

class Handler implements HttpHandler {
    private static final Charset UTF8 = Charset.forName("utf-8");

    public void handle(final HttpExchange exchange) throws IOException {
        try {
            Field f = exchange.getClass().getDeclaredField("impl");
            f.setAccessible(true);
            Object obj = f.get(exchange);
            f = obj.getClass().getDeclaredField("connection");
            f.setAccessible(true);
            obj = f.get(obj);
            f = obj.getClass().getDeclaredField("chan");
            f.setAccessible(true);
            SocketChannel chan = (SocketChannel) f.get(obj);
            System.out.println("Remote address: " + chan.getRemoteAddress());
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(exchange.getRequestBody(), UTF8)))
            {
                String s;
                while ((s = reader.readLine()) != null) {
                    System.out.println("Input: " + s);
                }
            }
            exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0);
            try (OutputStream os = exchange.getResponseBody()) {
                for (int j = 0; j < 3; ++j) {
                    os.write(("Lesson #" + (j + 1)).getBytes(UTF8));
                    for (int i = 0; i < 10; ++i) {
                        os.write("I will use Google before asking dumb questions".getBytes(UTF8));
                        Thread.sleep(100);
                    }
                    os.flush();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class Main {
    public static void main(final String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/", new Handler());
        server.setExecutor(null);
        server.start();
        Thread.sleep(1000);
	server.stop(0);
    }
}