# String per ByteBuffer empfangen?



## Angel4585 (26. Sep 2007)

Hallo,

ich sende via 

```
socket.getOutputStream().write("Test".getBytes());
```
Daten an den Server.

Dort hole ich folgendermaßen die Daten ab:

```
ByteBuffer b = ByteBuffer.allocate(100);
if(key.isReadable()){
    SocketChannel sc = (SocketChannel)key.channel();
    sc.read(b);
    System.out.println(b.asCharBuffer().toString());
}
```

Wenn ich einfach nur eine Zahl sende, also:


```
socket.getOutputStream().write(1);
```

Dann bekomm ich die auch und kann sie via:


```
ByteBuffer b = ByteBuffer.allocate(1);
if(key.isReadable()){
    SocketChannel sc = (SocketChannel)key.channel();
    sc.read(b);
    System.out.println(b.get(0));
}
```

auch ausgeben.

Aber wie geht das mit Strings?
Das ganze basiert auf SocketChannels auf der Serverseite und normalen Sockets auf der Clientseite.
Das Problem ist ads die Strings nie ankommen.. da kommt nur ne leere Zeile in der Ausgabe


----------



## Murray (26. Sep 2007)

1. Wenn du sicher sein willst, dass beim Client wirklich etwas ankommt: nach dem write flush aufrufen
2. Wenn man auf der einen Seite Bytes schreibt, muss man auf der anderen Seite auch Bytes lesen; ich bin mir nicht sicher, ob der CharBuffer die Konvertierung der Unicode-Zeichen intern macht
3. ByteBuffer.asCharBuffer() erzeugt nur eine andere View auf den Buffer, liest aber noch keine Daten, wie das im zweiten Beispiel mit get(0) passiert


----------



## Angel4585 (26. Sep 2007)

ok und wie sieht das in Code aus? 

Es kommen definitiv Daten an, nur werden jetzt zwei "??" ausgegeben, also vermte ich.. hmm.. kA.. irgendwas stimmt halt nicht... wie soll ich das machen mit der Konvertierung?


----------



## tuxedo (26. Sep 2007)

Muss es unbedingt ein ByteBuffer sein? Auch mit NIO kannst du meines wissens einen DataInputStream und DataOutputStream benutzen, mit welchem du prima Strings, Ints und sonstige Sachen durchschicken kannst.

- Alex


----------



## kopfsalat (26. Sep 2007)

Für das Encodieren und Decodieren des Strings in Bytes nutze lieber ein Charset

```
Charset charset = Charset.forName("UTF-8");
```

Dann sende per OutputStream via:

```
socket.getOutputStream().write(charset.encode(s).array());
```

Empfangen geht dann mit:

```
String s = charset.decode(b).toString(); // b ist dein Empfangs-ByteBuffer, decode liefert CharBuffer
```

Ich weiß allerdings nicht, wie sich das verhält, wenn man per OutputStream sendet und per SocketChannel empfängt. Eigentlich solltest du auch über SocketChannel senden, also sowas wie:

```
socketChannel.put(charset.encode(s));
```


----------



## tuxedo (26. Sep 2007)

kopfsalat hat gesagt.:
			
		

> Ich weiß allerdings nicht, wie sich das verhält, wenn man per OutputStream sendet und per SocketChannel empfängt. Eigentlich solltest du auch über SocketChannel senden, also sowas wie:
> 
> ```
> socketChannel.put(charset.encode(s));
> ```



Das sollte eigtl egal sein. Ich hab schon von C nach Java mit Socket Daten geschickt und umgekehrt.  Socketchannel ist nur die NIO Implementierung der ganzen Socketgeschichte ...


----------



## Angel4585 (27. Sep 2007)

alex0801 hat gesagt.:
			
		

> kopfsalat hat gesagt.:
> 
> 
> 
> ...



Egal oder nicht.. mit dem Charset funktioniert es, ohne nicht 

Danke alex0801 und kopfsalat    :toll:


----------

