HTTP Server Bildübertragung

Ich bin dabei einen HTTP Server zu schreiben.
Jetzt möchte ich ein Bild einlesen und an den Client schicken.
Bei dem kommt allerdings nur n verstümmeltes Bild an.
Ich habe die Bilder bisher mit nem FileInputStream oder FileReader/BufferedRaader eingelesen. Isr wahrscheinlich nicht die richrige Methode.
Beim Vergleich des Codes vom Originalbild und dem Übertragenen im Hexeditor sind mir ein paar kleine Unterschiede aufgefallen (8Fh wird zu 3Fh,… die meisten Zeichen passen aber --> anderer Zeichensatz?).
Die falsche Kodierung kommt schon beim Einlesen zustande.

Kann mir jemand sagen, wie ich ein Bild einlesen muss, damit ich den richtigen Code erhalte?

Hallo,

FileReader/BufferedRaader eingelesen. Isr wahrscheinlich nicht
die richrige Methode.
Beim Vergleich des Codes vom Originalbild und dem Übertragenen
im Hexeditor sind mir ein paar kleine Unterschiede aufgefallen
(8Fh wird zu 3Fh,… die meisten Zeichen passen aber -->
anderer Zeichensatz?).

Richtig, InputStreamReader ist zum Einlesen von Text gedacht, da ist das Character Encoding entscheidend:

An InputStreamReader[1] is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset. The charset that it uses may be specified by name or may be given explicitly, or the platform’s default charset may be accepted.
FileInputStream liest nur Bytes, damit sollte es funktionieren.

gruß
Heavy

[1] FileReader ist eine Subclass von InputStreamReader

Danke erstmal, aber den FileInputStream habe ich bereits wie folgt benutzt:

FileInputStream input = new FileInputStream(inputFile);
int byteCount = input.available();
byte[] dataBytes = new byte[byteCount];
while(input.available()>0){
input.read(dataBytes);
}

Wenn ich mein ByteArray direkt nach dem Einlesen in der Konsole ausgebe und mit dem Code im Hexeditor vergleiche, seh ich auch schon die Unterschiede zum Original.

Zum Client schicke ich die Daten, indem ich mein ByteArray zum String mache (new String(byteArray)) und über den PrintWriter sende.

out = new PrintWriter(clientSocket.getOutputStream(), true);
out.write(responsetext); //hier ist das ByteArray mit drin

Liegt der Fehler darin, dass ich meinen Bytestrom zum String mache?

Es werden auch nur bestimmte Zeichencodes verfäscht: 0x81, 0x8D, 0x8F, 0x90 vom Original werden zu 0x3F. Mehr als 99% der Zeichencodes werden aber richtig übertragen.

gruß
ziba

Liegt der Fehler darin, dass ich meinen Bytestrom zum String
mache?

Ja, das selbe geschieht auch bei der Ausgabe auf die Konsole (die ja auch nur eine Zeichenkette darstellt). In beiden Fällen kommt wieder das Characterset ins Spiel.

Es werden auch nur bestimmte Zeichencodes verfäscht: 0x81,
0x8D, 0x8F, 0x90 vom Original werden zu 0x3F. Mehr als 99% der
Zeichencodes werden aber richtig übertragen.

Der Großteil der Zeichen ist in den verschiedenen charactersets identisch, wenn du jedoch z.B. versuchst Umlaute auf die (Windows) Konsole aus einem Java Programm heraus auszugeben, wirst du jedoch feststellen, daß das diese auch falsch ausgegeben werden (wenn du das Characterset nicht anpasst).

Ich bin mir jetzt nicht ganz sicher wie das bei einem HTTP-Server normalwerweise gemacht wird, ein Mail-Server sendet Attachments i.d.R. als Base64 kodierte zeichenketten, aber ich glaube ein Webserver liefert bei Binärdateien direkt dessen Bytes (unter Angabe des Content-Types im Header). Du solltest also nur HTML Datein als String senden, Binärdateien als OutputStream.

gruß
Heavy

danke, jetzt passts.

hatte ausserdem vergessen, zwischen header und daten eine leerzeile einzufügen.

gruß
ziba