2017-07-14 3 views
0

Ich schreibe einen UDP-Server-Nachrichten von Clients mit NIO zu erhalten:Warum bekomme ich eine Menge unerwünschter Ausgaben, wenn ich ByteBuffer in String umwandle?

DatagramChannel channel = DatagramChannel.open(); 
channel.socket().bind(new InetSocketAddress(9999)); 
ByteBuffer buf = ByteBuffer.allocate(1024); 
buf.clear(); 
while (channel.receive(buf) != null) { 
     System.out.println("---has received data:" + new String(buf.array(), ASCII)); 
     buf.clear(); 
} 

dann verwende ich nc einige Daten an den UDP-Server-Befehl

nc -u 127.0.0.1 9999 < ./test.txt 

gibt es nur eine Linie im Test zu senden. txt

#cat ./test.txt 
12345678 

und der Ausgang des Servers ist wie folgt enter image description here

also wie könnte ich die 12345678 Zeichenfolge und entfernen Sie die folgenden '口' Dinge?

+0

dies funktioniert für mich, hat keine '[]' Klammern – tima

Antwort

1
DatagramChannel channel = DatagramChannel.open(); 
channel.socket().bind(new InetSocketAddress(9999)); 

ByteBuffer chunkData = ByteBuffer.allocate(1024); 
chunkData.clear(); 

channel.receive(chunkData); 

// remove unwanted data 
byte[] validData = new byte[chunkData.position()]; 
System.arraycopy(chunkData.array(), 0, validData, 0, validData.length); 

System.out.println("---has received data:" + new String(validData)); 
2

Dies ist keine unerwünschte Ausgabe, weil Sie den gesamten Puffer drucken.

buf.clear(); nicht den Puffer mit Nullen löschen, es setzt nur die Position auf 0.

1
System.out.println("---has received data:" + new String(buf.array(), ASCII)); 

Sie ignorieren die Datagrammlänge. Dies sollte sein:

System.out.println("---has received data:" + new String(buf.array(), 0, buf.position()-1, ASCII)); 
Verwandte Themen