DatagramPacket为字符串

问题描述 投票:5回答: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(对于这个例子),我的出来就好了。

谢谢。

java bytearray datagram
6个回答
8
投票
new String(buffer, 0, packet.getLength())

2
投票

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


2
投票

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

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

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


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


0
投票

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

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

至于找长度,我不知道。


0
投票

尝试

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

要么

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

-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);
© www.soinside.com 2019 - 2024. All rights reserved.