Java ist auch eine Insel

Mittwoch, Juli 12, 2006

Insel: Einen Webserver mit der com.sun.net.httpserver.HttpServer Klasse aus Java 6

Java bietet seit der Version 6 eine API, um Web-Services anzusprechen und auch neue Web-Services zu definieren und am eigenen Rechner anzumelden. Doch um Web-Services anbieten, und entfernten Clients Zugriff gewähren zu können, ist immer ein Web-Server nötig. Aus diesem Grund hat Sun einen einfachren HTTP-Server integriert, der sich auch eingeständig nutzen lässt; die Klassen sind zwar mehr oder weniger privat im Paket com.sun.net.httpserver deklariert, dennoch wollen wir ein Beispiel wagen.

Im Mittelpunkt steht die Klasse HttpServer – eine abstrakte Oberklasse, von der die Fabrikmethoden create() und create(InetSocketAddress, int) ein konkretes Exemplar liefern. Im nächsten Schritt verbindet die Methode createContext() einen Pfad (wie etwa /webapp1/) mit einem bestimmten HttpHandler, der die Anfrage an den Pfad übernimmt.

public class HttpServerDemo
{
public static void main( String[] args ) throws IOException
{
HttpServer server = HttpServer.create( new InetSocketAddress( 80 ), 0 );
server.createContext( "/", new DateHandler() );
server.start();
}
}


Jeder Handler implementiert die Schnittstelle HttpHandler mit der Funktion handle(HttpExchange), die über den Parameter HttpExchange Zugriff auf Header, Anfragekörper und Ergebnis ermöglicht.

Ein einfacher HttpHandler, der Anfragen mit einer HTML-Seite beantwortet, die Datum und den Anfragepfad enthält, kann so aussehen:

class DateHandler implements HttpHandler
{
public void handle( HttpExchange httpExchange ) throws IOException
{
httpExchange.getResponseHeaders().add( "Content-type", "text/html" );
String response = "<b>" + new Date() + "</b> for " + httpExchange.getRequestURI();
httpExchange.sendResponseHeaders( 200, response.length() );

OutputStream os = httpExchange.getResponseBody();
os.write( response.getBytes() );
os.close();
}
}


Die Methode getResponseHeaders() liefert ein Headers-Objekt (eine Map<String,List<String>>), zum Setzen der Response-Header. Das Beispiel setzt den Content-type auf text/html. Die Methode sendResponseHeaders schließt die Header-Angaben mit einem Statuscode (Response-Code) und der Content-Länge ab. getRequestURI() gibt den Pfad und ermöglicht uns das Zerlegen der Elemente nach Verzeichnis, Datei, Dateiendung, Ankern und Parametern.

HttpExchange liefert mit getResponseBody() einen OutputStream, dass das Ergebnisdokument formuliert. Die Methode getRequestBody() liefert einen InputStream für das, was der Client sendet. Das Beispiel schreiben die Bytes vom String in den OutputStream und schließt ihn anschließend.

Nach dem Start des Server können wir im Webbrowser URLs wie http://localhost/, oder http://localhost/webapp/bla eingeben und wir erhalten das Datum und die Pfadangabe.

AddThis Social Bookmark Button

2 Comments:

  • Hallo,

    Ich hab das ausprobiert aber nicht zum Laufen gebracht.
    server.start() kommt sofort zurück und öffnet keinen port.
    was mach ich falsch ?

    By Anonymous Anonym, at September 27, 2006 10:47 AM  

  • Ursache ist dass der HttpServer ein Deamon Thread ist, welchersich zusammen mit dem Programm beendet.
    Ein System.in.read() nach dem Start und schon geht's.

    By Anonymous Anonym, at September 27, 2006 11:03 AM  

Kommentar veröffentlichen

<< Home