# Problem bei der Stringübertragung



## TheNME123 (17. Nov 2006)

Hallo alle zusammen,

ich habe folgendes Problem: 
Für eigenes Netzwerkprotokoll möchte ich gerne Strings für die Befehle nutzen ("GET, LIST, etc"). Ich bin jetzt soweit fertig mit dem Server-Teil den ich schon ausgiebig und ohne Probleme per Telnet getestet habe. Als ich jetzt zum ersten Mal den Client Teil ausprobiert habe der zunächst nur Strings empfangen sollte musste ich erschreckt feststellen das nach jedem Char der eigentlich dort stehen sollte noch ein weiterer hinzukam der da nicht hingehört (in dem Fall das leere Quadrat). 

So sollte es aussehen: <ACCEPTED>;
So sieht es aus: (Quadrat)<(Quadrat)A......(Quadrat)> 

Ich vermute ein Charset Problem kann mir jedoch noch keinen Reim darauf machen. Hier mal der Code zum senden und empfangen.

Server:

```
ByteBuffer writeBuffer = ByteBuffer.allocate(100);
String testMessage = ("<ACCEPTED>;");
for(char ch: testMessage.toCharArray()) {
        writeBuffer.putChar(ch);
}
writeBuffer.flip();
socket.write(writeBuffer);
```

socket ist in dem Fall ein SocketChannel!

Und der Client:

```
ByteBuffer bb = ByteBuffer.allocate(8192);
socket.read(bb);
bb.flip();
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(bb);
String result = charBuffer.toString();
System.out.println(result);
message.append(result);
```

socket ist wieder ein SocketChannel! Ich hab auch bereits statt UTF-8 auch ISO-8859-1 versucht. Ich weiss leider nicht mehr weiter. 

Vielen Dank und Grüße

TheNME123[/code]


----------



## SlaterB (17. Nov 2006)

> Für eigenes Netzwerkprotokoll

was benutzt du denn nun zum Übertragen, ganz normale Standardsockets oder eine eigene Implementierung?

wenn Standardsockets: lösche dein gesamtes Programm und benutze ein Standard-Tutorial-Beispiel,
tritt da der Fehler auch auf?


----------



## TheNME123 (17. Nov 2006)

Ich benutze den ServerSocketChannel, SocketChannel für die Netzwerkimplementierung da ich auf nicht blockierendes schreiben und lesen angewiesen bin. Ich kann leider nicht für jede Verbindung einen eigenen Thread starten! 

Wie bereits gesagt ist die Kommunikation per Telnet mit dem Server ohne weiteres möglich. Die Strings kommen korrekt an etc. Nur wenn die beiden Java Teile miteinander kommunizieren versteht der Client nur Bahnhof obwohl die Implementierung zum String lesen in Server und Client indentisch sind. 

Ich weiss aber auch leider nicht genau auf Basis welches Character Encodings das dann abläuft. Java arbeitet mit Unicode aber gilt das auch für die Sockets? Bzw. wie arbeitet Telnet? Auch Telnet muss ja aufgrund irgendeiner Tabelle die Bytes wieder in lesbare Buchstaben zurückwandeln. 

Ein wirklich schlechter Workarround wäre natürlich immer das erste von 2 Zeichen zu löschen die ankommen aber das kann ja irgendwie nicht die Lösung sein. 

Grüße

TheNME123


----------



## Murray (17. Nov 2006)

Ich habe es nicht ausprobiert, aber m.E. sollte man die mit putChar in einen ByteBuffer gepackten Characters auch nur mit getChar wieder auslesen. Die Annahme, dass die interne Repräsentation (also die beiden beim putChar in den ByteBuffer geschriebenen Bytes) irgendeinem Encoding entspräche, kann man wohl nicht treffen (ist es nicht auch so, dass das Encoding i.d.R. die 2-Byte-Unicode-Sequenz auf ein Byte abbildet?).

Sollte es nicht reichen, im Client den ByteBuffer mit getChar auszulesen, dabei zeichenweise einen CharBuffer zu füllen und dann mit CharBuffer#toString den String zu holen?


----------



## TheNME123 (17. Nov 2006)

Danke Murray das war der entscheidende Tip! Es scheint sich dabei in der Tat nicht um ein richtiges Encoding zu handeln. Im Endeffekt ist die Lösung noch ein bisschen simpler als mit getChar.


```
ByteBuffer bb = ByteBuffer.allocate(8192);
socket.read(bb);
bb.flip();
CharBuffer charBuff = bb.asCharBuffer();
String result = charBuff.toString();
```

Das die Lösung so einfach sein könnte damit hätte ich nicht gerechnet   

Vielen Dank für die Hilfe und Grüße

TheNME123[/code]


----------



## TheNME123 (17. Nov 2006)

Nochmal ein kleines Update. Man kann auch mit einem Charset arbeiten. Java benutzt jedoch nicht Unicode UTF-8 sondern Unicode UTF-16. Dann klappt es auch mit der alten Methode!


----------

