DatagramPacket为字符串

试图将收到的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(对于这个例子),我的出来就好了。

谢谢。

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

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

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

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

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


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

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

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

至于找长度,我不知道。

尝试

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

要么

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

请改用此代码

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