RMI Character Encoding bei In- / OutputStreams

dake

Neues Mitglied
Hallo erstmal,

möchte gerade eine Client-/Server-Anwendung unter Java / RMI schreiben, dabei stellt sich die Frage inwiefern RMI die (möglicherweise) unterschiedlichen Charsets des Client- und Servers umwandelt.

Folgendes scheint erstmal machbar:

  • Senden von reinen Strings -> Strings werden in Unicode formatiert
  • Senden von BufferedReader-/BufferedWriter-Objeken sollte auch kein Problem sein, da diese bereits bei Instanziierung in der jeweiligen VM das Encoding mitbekommen.
  • Senden von Stream-Objekten :question: --> Wenn im Server-Interface eine Methode deklariert ist, die einen Stream zurückgibt und im Client wird diese in einen StreamReader/-Writer gepackt, kann es passieren dass dann beim Lesen/Schreiben "Kauderwelsch" rauskommt?
  • Außerdem, was passiert beim Versenden von Reader-/Writer-Objekten die auf Empfängerseite in einen BufferedReader/-Writer gepackt werden? Reader und Writer akzeptieren ja keine Angabe des Encodings im Konstruktor.

Soviel vorab, am liebsten würde ich über RMI lediglich Streams versenden, da für diese bereits eine RMI fähige Implementierung vorliegt, für Reader/Writer müsste diese wohl noch geschrieben werden. Wie stelle ich also sicher, dass auf Empfängerseite immer Text im korrekten (Empfänger-OS spezifischen) Encoding ankommt?

Achja, der Text muss deshalb im Empfänger-OS-Encoding ankommen, da dieser in Dateien geschrieben wird, die später von einer anderen Anwendung ausgewertet werden.

Danke schonmal vorab.
 
T

tuxedo

Gast
Wie stelle ich also sicher, dass auf Empfängerseite immer Text im korrekten (Empfänger-OS spezifischen) Encoding ankommt?

Ähm, gar nicht? Ist auch nicht notwendig. Macht ja auch wenig Sinn die Anforderungen die beim schreiben in eine Datei vorliegen auf die Netzwerkkommunikation abzubilden...

Lass doch das ganze senden und empfangen mit Unicode laufen und konvertiere dann erst beim schreiben in die Datei in dein gefordertes Encoding.

- Alex
 

dake

Neues Mitglied
Mensch, das ging ja schnell :)

Also der Hinweis ist super, muss mir dann lediglich eine andere Implementierung für meine Server-Interfaces überlege.

Zur Zeit sieht das ganze so aus:

RMI-Server
Java:
	@Override
	public OutputStream putFile() throws RemoteException, IOException {
		return new RMIOutputStream(new RMIOutputStreamImpl(
				new FileOutputStream(new File(getInputDir(), "filename"))));
	}

Die Klasse RMIOutputStream serialisiert also einen vorhandenen OutputStream um diesen übers Netzwerk zu senden.

Streams akzeptieren allerdings Character-Angabe (klar, enthalten ja auch nur bytes).

Ich müsste also entweder die FileOutputStream-Klasse so erweitern, dass deren write()-Methoden die Bytes von Unicode auf System-Encoding konvertiert. Klingt erstmal nicht ganz einfach, dazu bräuchte ich dann einen 8-Byte-Buffer (UTF-8 = 8 bytes ?!) und jedesmal wenn dieser voll ist wird er in ein System-Charset kodiertes Byte-Array umgewandelt und dann mit super.write(...) geschrieben.

Ist das so einigermaßen korrekt? Geht es auch unkomplizierter? ;-)

Nachtrag (Umsetzung mit Reader-/Writer-Objekten):

RMI-Server
Java:
	@Override
	public Writer putAsciiFile() throws RemoteException, IOException {
		return new RMIWriter(OutputStreamWriter(
				new FileOutputStream(new File(getInputDir(), "filename"))));
	}

Dabei empfängt der RMIWriter Daten in Unicode, der OutputStreamWriter wird auf dem Server instanziiert, so dass dieser sowieso mit dem System-Charset arbeitet.

Würde das wohl funktionieren ?
 

Ähnliche Java Themen


Oben