# SocketChannel & Socket & JDom & Encoding



## planetenkiller (24. Jun 2007)

hallo

Ich versuche gerade eine kleine Client-Server  Anwendung zu schreiben. Dabei habe ich mir gesagt, ich Encodiere die Daten in UTF-8 um sicher keine Probleme bei Verschiedenen OS zu haben. Die Übertragung findet in XML statt, dazu verwende ich JDom.  Leider sind sind die Umlaute immer Falsch, bei Debug Ausgabe am Server oder Client.

Mein Aufbau:
Client Verbindungsaufbau:

```
Socket toserver = new Socket( "192.168.1.34", 9876 );
InputStreamReader inOld = new InputStreamReader(toserver.getInputStream(),"UTF-8");
in = new BufferedReader(inOld);
OutputStreamWriter outOld = new OutputStreamWriter(toserver.getOutputStream(),"UTF-8");
out = new BufferedWriter(outOld);
System.out.println("Encoding, In:"+inOld.getEncoding()+" Out:"+outOld.getEncoding());
```
Bei den Streams habe ich das Encoding auf UTF-8 gestellt.

Senden von Daten:

```
char[] text = DecodeMessage.getInstance().makeMsg(ToName.getText(),msgText.getText()); // in msgText ist der Text mit den umlauten
out.write(text);
out.flush();
```

Die makeMsg() erstellt das xml:

```
Document myDoc = new Document();
char[] t = null;
	
Element root = new Element("message");
myDoc.setRootElement(root);
// code....
Element body = new Element("body");
body.setText(text);  // text mit den umlauten
root.addContent(body);
 XMLOutputter out = new XMLOutputter(Format.getRawFormat()); 
CharArrayWriter temp = new CharArrayWriter();
out.output(myDoc, temp);
t = temp.toCharArray();
return t;
```

Nun zum Server, ich verwende NIO, also einen Selector, SocketChannel ...
So schreibe ich das Empfangene xml in einen String:

```
String Message = "";
 // schreibe daten in String
while ((bytes = socketChannel.read(sharedBuffer)) > 0) 
{
     sharedBuffer.flip();

     Message += Charset.forName("UTF-8").decode(sharedBuffer).toString();
     //Message += sharedBuffer.asCharBuffer().toString();
                                
     sharedBuffer.clear();
}
System.out.println("Neune Nachricht:"+Message);
```
sharedBuffer ist ein ByteBuffer. Ich decodiere ich die Empfangenen Daten von UTF-8, da sonnst bei der ausgbe nur fragezeichen wären, und jDom sonst irgendwie auch nicht klarkommt   ???:L

Ich generiere auf dem Server ein neues XML wie oben mit makeMsg() mit dem unterschied, das ich ein String generiere:

```
XMLOutputter out = new XMLOutputter(Format.getRawFormat()); 
return out.outputString(myDoc);
```
Senden zum Client mache ich so:

```
out.write(ByteBuffer.wrap(msg.getBytes()));   // out ist ein SocketChannel
```

Am Client lese ich die Daten mit einem BufferedReader und gebe sie aus.
Auch ein System.out.println(Message.getChild("body").getText()); zum augeben des Textes mit Umlauten sind sie falsch.

Habt ihr eine Idee wo der Fehler sein könnte? ???:L  :cry:


----------



## HoaX (24. Jun 2007)

daran dass deine console kein utf8 darstellen tut?


----------



## planetenkiller (24. Jun 2007)

Ich schreibe das XML nach dem empfangen auch in ein JTextArea.  Auch da stimmen sie nicht.


----------



## kleiner_held (24. Jun 2007)

planetenkiller hat gesagt.:
			
		

> Senden zum Client mache ich so:
> 
> ```
> out.write(ByteBuffer.wrap(msg.getBytes()));   // out ist ein SocketChannel
> ```




msg.getBytes() ist falsch, da du hier das default Encoding des OS nimmst und nicht das sonst überall verwendete UTF-8.
msg.getBytes("UTF-8"); Wäre in dem Fall richtig.

Ansonsten finde ich, dass Du viele Sachen sehr umständlich machst und dadurch, dass du verschiedene Techniken auf Client- und Server-Seite verwendest, wird dein Design auch sehr unübersichtlich.


----------



## planetenkiller (24. Jun 2007)

kleiner_held hat gesagt.:
			
		

> msg.getBytes() ist falsch, da du hier das default Encoding des OS nimmst und nicht das sonst überall verwendete UTF-8.
> msg.getBytes("UTF-8"); Wäre in dem Fall richtig.


Das war natürlich genau die stelle, an die ich nicht gedacht hätte. Es geht jetzt, vielen Dank.



			
				kleiner_held hat gesagt.:
			
		

> Ansonsten finde ich, dass Du viele Sachen sehr umständlich machst und dadurch, dass du verschiedene Techniken auf Client- und Server-Seite verwendest, wird dein Design auch sehr unübersichtlich.


Da hast du recht, aber ich bin ja noch nicht fertig. Werde ich vielleicht am Client noch umstellen.

@HoaX
Windows eben....man kann nicht mal umstellen.


----------

