Here are the code examples for Service implementations, given separately here for clarity:

This service is an HTTP mirror, just like the HttpMirror class
implemented earlier in this chapter.  It echoes back the client's
HTTP request

public static class HTTPMirror implements Service {
    public void serve(InputStream i, OutputStream o) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(i));
        PrintWriter out = new PrintWriter(o);
        out.print("HTTP/1.0 200 \n");
        out.print("Content-Type: text/plain\n\n");

        String line;

        while ((line = in.readLine()) != null) {
            if (line.length() == 0) {
                break;
            }

            out.print(line + "\n");
        }

        out.close();
        in.close();
    }
}

This is another example service.  It reads lines of input from the
client, and sends them back, reversed.  It also displays a welcome
message and instructions, and closes the connection when the user
enters a '.' on a line by itself.

public static class Reverse implements Service {
    public void serve(InputStream i, OutputStream o) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(i));
        PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(o)));
        out.print("Welcome to the line reversal server.\n");
        out.print("Enter lines.  End with a '.' on a line by itself.\n");

        for (;;) {
            out.print("> ");
            out.flush();

            String line = in.readLine();

            if ((line == null) || line.equals(".")) {
                break;
            }

            for (int j = line.length() - 1; j >= 0; j--)
                out.print(line.charAt(j));

            out.print("\n");
        }

        out.close();
        in.close();
    }
}

A very simple service.  It displays the current time on the server
to the client, and closes the connection.

public static class Time implements Service {
    public void serve(InputStream i, OutputStream o) throws IOException {
        PrintWriter out = new PrintWriter(o);
        out.print(new Date() + "\n");
        out.close();
        i.close();
    }
}

This service demonstrates how to maintain state across connections by
saving it in instance variables and using synchronized access to those
variables.  It maintains a count of how many clients have connected and
tells each client what number it is

public static class UniqueID implements Service {
    public int id = 0;

    public synchronized int nextId() {
        return id++;
    }

    public void serve(InputStream i, OutputStream o) throws IOException {
        PrintWriter out = new PrintWriter(o);
        out.print("You are client #: " + nextId() + "\n");
        out.close();
        i.close();
    }
}