Socket Zeichenübertragung findet nicht korrekt statt

  • Themenstarter Themenstarter faabi
  • Beginndatum Beginndatum
F

faabi

Gast
Hallo,

ich habe ein Problem bei der Realisierung einer einfachen Datei Übertragung per Java Socket.

Auf dem Server existiert eine PDF Datei (bzw. eine Text Datei wurde ebenfalls getestet), die per Request an den Client geschickt werden soll.
Ich habe das ganze mit einer ganz simplen "Zeichen-für-Zeichen-Übertragung" bewerkstelligt, was an sich auch funktioniert, das Problem ist nur das die Datei nicht "Eins-zu-Eins" beim Client ankommt ...

Übertrage ich eine Text Datei mit Sonderzeichen, werden diese schon falsch dargestellt. Übertrage ich eine PDF Datei, welches das eigentliche Szenario darstellt, lässt sich diese nicht öffnen nachdem sie übertragen wurde. (Ich nehme an weil auch hier nicht alle Zeichen korrekt übertragen werden.

Was kann ich tun damit die Zeichen wirklich 100% so ankommen wie sie in der Urprungsdatei standen?
(Bei den Plattformen handelt es sich auf Serverseite um Windows7 und auf Clientseite um Google Android)


Server sendet Datei:

Java:
private static void sendFile(Socket client) throws IOException {
		
		File f = new File("C:/pdftest/test.pdf");
		int fileSize = (int)f.length();
		
		BufferedReader br2 = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8"));
		
		char fileBuffer[] = new char[fileSize];
		
		OutputStream os = client.getOutputStream();
		
		for (int i = 0; i < fileSize; i++)
		{
			br2.read(fileBuffer);
			os.write(fileBuffer[i]);
		}
		
	}


Client fordert Datei an, bzw. empfängt Datei:

[Java]
private void handleConnection() {

try {
File pdfFile = new File("/sdcard/cam_info.pdf");
//FileWriter fw = new FileWriter(pdfFile);
FileOutputStream fs = new FileOutputStream(pdfFile);


OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

// File request senden:
int msg = 123; // 123 = get_auth_pdf
os.write(msg);

// fs.write(br.read());

// Datei-Inhalte schreiben:
int i = 0;
while ((i = br.read()) != -1)
{
fs.write(i);
}

fs.write(-1);
fs.flush();
fs.close();
}
}
[/code]


Vielen Dank,
Gruß Fabian =)
 
du machst eine Menge ungleichmäßig, das ursprüngliche PDF liest du als Reader, also chars statt bytes, zudem in einem bestimmten CharSet, UTF-8,
im Client schreibst du dann aber letzlich mit einem simplen OutputStream, kein Writer (für chars statt bytes), schon gar nicht UTF-8

auch bei der inneren Socket-Übertragung wechselst du munter hin und her:
die chars, die der Server aus dem PDF-BufferedReader liest, sendest du mit Socket-Outputstream, das ist eine byte-Methode,
die kann generall nur 256 verschiedene Werte verschicken, zusätzliche Information des höheren char-Datentyps geht verloren

auf Client-Seite hast du dann für den Socket aber verrückterweise wieder einen Reader, versuchst chars zu lesen, die aus mehrere bytes bestehen können

das ist ja so querbett, hast du überhaupt ein Konzept?

----

idealerweise überträgst du Dateien immer nur als bytes, mit FileInputStream lesen, evtl. BufferedInputStream, aber kein Reader,
mit FileOutputStream speichern, das hast du ja schon,
bei den Sockets auch zunächst nur die Streams an sich, keine Reader/ Writer erstellen,
evtl. Buffer, aber es gibt wie gesagt BufferedInputStream/ BufferedOutputStream, kein Grund für Reader/ Writer

dann solltest du noch genauer nachdenken und entscheiden (auch das schaffst du bisher konzeptlos zu mischen!!) ob du alle bytes einzeln per Schleife schreibst und liest (dann unbedingt Buffer!)
oder mehr oder weniger große Arrays verwendest (dann Buffer nicht unbedingt nötig)


vermeide auf jeden Fall noch Fehler wie in Zeile 15 im ersten Code,
dort reicht es, EINMAL vor der Schleife, das Array zu befüllen,
kannst froh sein wenn das Array nicht kaputt geht, wenn der Aufruf in der Schleife steht,
aber wie gesagt: wenn überhaupt Array, dann Schleife gar nicht nötig, dann die write-Methode für Array benutzen
 
Zuletzt bearbeitet von einem Moderator:
Sämtliche Reader und Writer Klassen sind für textbasierte Dateien ausgelegt. Da kannst du nicht einfach mit nem BufferedReader arbeiten. Du musst hier mit Streams arbeiten.
 

Zurück
Oben