DatagramPacket为字符串

时间:2011-12-19 04:35:45

标签: java bytearray datagram

尝试将收到的DatagramPacket转换为字符串,但我遇到了一个小问题。不确定什么是最好的方法。

我将收到的数据大部分都是未知长度,因此我的接收端设置了一些缓冲区[1024]。问题是,假设我发送了字符串“abc”并在接收方执行了以下操作......

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
buffer = packet.getData();
System.out.println("Received: "+new String(buffer));

我得到以下输出:abc [] [] [] []] [] [] [] .....一直到缓冲区长度。 我猜测最后的所有垃圾/空都应该被忽略,所以我一定做错了。“我知道buffer.length是问题,因为如果我将它改为3(对于这个例子),我的出来就好了。

感谢。

6 个答案:

答案 0 :(得分:8)

new String(buffer, 0, packet.getLength())

答案 1 :(得分:2)

DatagramPacket的长度字段给出了实际收到的数据包的长度。有关详细信息,请参阅DatagramPacket.receive的{​​{3}}。

所以你只需要使用不同的String构造函数,传递字节数组和实际接收的字节数。

例如,请参阅@jtahlborn或@ GiangPhanThanhGiang的答案。


然而,在将字节解码为UTF-16字符串时,仍然存在应该使用哪种字符编码的问题。对于您的特定示例,它可能无关紧要。但是,如果您传递的数据可能包含非ASCII字符,那么您需要使用正确的字符集进行解码。如果您出错,您可能会在String值中出现乱码。

答案 2 :(得分:2)

使用此代码: String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());

答案 3 :(得分:0)

据我了解,DatagramPacket最后只有一堆垃圾。正如斯蒂芬C.建议的那样,你或许可以找到收到的实际长度。在这种情况下,请使用:

int realSize = packet.getLength() //Method suggested by Stephen C.
byte[] realPacket = new byte[realSize];
System.arrayCopy(buffer, 0, realPacket, 0, realSize);

至于查找长度,我不知道。

答案 4 :(得分:0)

尝试

System.out.println("Received: "+new String(buffer).trim());

String sentence = new String(packet.getData()).trim();
System.out.println("Received: "+sentence);

答案 5 :(得分:-2)

使用此代码

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String data = new String(packet.getData());
System.out.println("Received: "+data);