Axel Richter: eigener kleiner Server in Java

Beitrag lesen

Hallo,

angeregt durch eine interessante Vorlesung im noch aktuellen Wintersemester (Betriebssysteme, Rechnernetze und verteilte Systeme) habe ich mal versucht, selbst einen kleinen Server in Java zu schreiben.
Soweit klappt auch alles, bis auf das Ausliefern von Binärdateien.
Wenn ich die mit derselben Methode ausgeben lassen wie ASCII-Texte, sehen zB Bilder völlig kaputt aus. Und wenn ich versuche eine eigene Ausgabe für Binärdateien zu verwenden, werden einfach nur Zahlen rausgeworfen, die ein Browser auch nicht verwenden kann.

Weiss zufällig jemand, woran das liegen kann und wie man es anders machen sollte?
Die gelesenen Bytes vor der Ausgabe nach Char zu casten, bringt auch nichts.

Der HTTP-Response, den Du am besten über einen OutputStream in den OutputStream des Sockets schreibst, muss so aussehen:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6

Response      = Status-Line               ; Section 6.1
                       *(( general-header        ; Section 4.5
                        | response-header        ; Section 6.2
                        | entity-header ) CRLF)  ; Section 7.1
                       CRLF
                       [ message-body ]          ; Section 7.2

Beispiel für ein Gif-Bild von 50000 Octets Länge. CRLF = "\r\n":

HTTP/1.1 200 OK CRLF
Content-Type: image/gif CRLF
Content-Length: 50000 CRLF
CRLF
[Byte-Daten des Bildes]

Wenn das Bild eine auf dem Server gespeicherte Datei ist, dann bekommst Du diese am günstigsten über einen

FileInputStream fis = new FileInputStream(docroot.concat(requestURI.getPath()));

docroot wäre Dein Document-Root und requestURI die ausgelesene URI des Requests.
Content-Length wäre damit:

new Integer(fis.available())

und die Bytedaten könnte eine

private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception {
byte[] buffer = new byte[1024] ;
int bytes = 0 ;
while ((bytes = fis.read(buffer)) != -1 ) {
     os.write(buffer, 0, bytes);
}
    }

in den OutputStream des Sockets senden.

viele Grüße

Axel