数据报包转字符串

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 [][] [][] [] [][] [] ..... 一直到缓冲区长度。我猜末尾的所有垃圾/空值都应该被忽略,所以我一定做错了些什么。我知道问题出在缓冲区长度,因为如果我将其更改为3(对于这个例子),我的输出就很好。感谢。
6个回答

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

不幸的是,那个方法没有起作用。输出结果变得完全无意义。此外,Eclipse 警告说 String(byte[], int) 方法已经被弃用。当我使用与接收到的字符串长度相同的缓冲区进行初始化时,一切都很顺利,但仍然卡在同样的问题上。字符串的长度事先是未知的。 - user1105216
这个确实可以工作,不过要使用 new String(buffer, 0, packet.getLength());。非常感谢。 - user1105216

5
使用以下代码替代: String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());

2

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

因此,您只需使用不同的String构造函数,传递字节数组和实际接收的字节数即可。

请参见@jtahlborn或@GiangPhanThanhGiang的答案示例。


然而,这仍然需要解决一个问题,即在将字节解码为UTF-16字符串时应使用哪种字符编码。对于您的特定示例,可能并不重要。但是,如果传递的数据可能包含非ASCII字符,则需要使用正确的字符集进行解码。如果选择错误,您的String值将会出现乱码。


0

尝试一下

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

或者

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

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);

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

如果你要给我点踩,请解释一下原因,这样我下次就可以改进我的帖子。仅仅点踩是没有帮助的。 - Ryan Amos
2
你原来的回答并没有提供任何有关获取数据包长度的有意义的信息,而这基本上就是问题所在。另外,一旦你知道了数据包的长度,就没有必要复制数组了。 - jtahlborn
复制的目的是将缓冲区大小从1024减小到数据包大小。 - Ryan Amos
1
一旦您知道实际数据包大小,复制就是不必要的。例如:new String(packet.getData(), packet.getOffset(), packet.getLength()); - user207421
1
关于“找到长度”,你已经找到了。答案完全不清楚。 - user207421

-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);

使用这段代码的原因是什么?仅仅给出代码并不是一个答案。你必须解释清楚。这段特定的代码与 OP 原始代码在语义上完全相同,因此并没有更好的效果。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接