6

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

谢谢。

4

6 回答 6

10
new String(buffer, 0, packet.getLength())
于 2011-12-19T04:41:09.027 回答
4

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

于 2017-01-07T05:42:26.923 回答
2

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

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

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


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

于 2011-12-19T04:41:30.260 回答
0

据我了解,DatagramPacket 最后只有一堆垃圾。正如 Stephen C. 建议的那样,您也许能够找到收到的实际长度。在这种情况下,请使用:

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

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

于 2011-12-19T06:07:24.693 回答
0

尝试

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

或者

String sentence = new String(packet.getData()).trim();
System.out.println("Received: "+sentence);
于 2017-12-17T20:26:00.400 回答
-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);
于 2016-11-02T19:42:26.557 回答