Java 数据包到字符串

Java 数据包到字符串,java,bytearray,datagram,Java,Bytearray,Datagram,正在尝试将接收到的DatagramPacket转换为字符串,但我遇到了一个小问题。我不知道最好的办法是什么 我将要接收的数据大部分长度未知,因此我在接收端设置了一些缓冲区[1024]。问题是,假设我发送了字符串“abc”,然后在接收方执行以下操作 buffer = new byte[1024]; packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); buffer = packet.getData(

正在尝试将接收到的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[][]][]][]]。。。。。一直到缓冲区长度。 我猜结尾的所有垃圾/null都应该被忽略,所以我一定是做错了什么。”我知道buffer.length是个问题,因为如果我将其更改为3(在本例中),我的输出结果就很好


谢谢。

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

new String(buffer, 0, packet.getLength())
因此,您只需使用不同的
字符串
构造函数,传递字节数组和实际接收的字节计数

例如,参见@jtahlborn或@giangphanthanghang的答案



但是,这仍然存在将字节解码为UTF-16字符串时应使用哪种字符编码的问题。对于您的特定示例,这可能无关紧要。但如果您传递的数据可能包含非ASCII字符,则需要使用正确的字符集进行解码。如果您弄错了,则可能会导致错误o获取
字符串中的乱码。

据我所知,DatagramPacket的末尾有一堆垃圾。正如Stephen C.所建议的,您可能能够找到收到的实际长度。在这种情况下,请使用:

int realSize = packet.getLength() //Method suggested by Stephen C.
byte[] realPacket = new byte[realSize];
System.arrayCopy(buffer, 0, realPacket, 0, realSize);
至于查找长度,我不知道。

请使用此代码

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String data = new String(packet.getData());
System.out.println("Received: "+data);
改为使用此代码:
String msg=新字符串(packet.getData()、packet.getOffset()、packet.getLength());
试试看

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


不幸的是,这不起作用。out变得毫无意义。eclipse还警告方法字符串(byte[],int)已弃用。当我使用要接收的字符串的确切长度初始化缓冲区时,一切都很好,但仍然存在相同的问题。字符串的长度将不会事先知道。但这确实有效,但新字符串(缓冲区,0,packet.getLength());非常感谢。如果你打算进行下一次投票,请解释原因,以便我下次修改帖子。简单的下一次投票没有任何帮助。你最初的答案没有提供任何关于获取数据包长度的有意义的信息,这基本上就是问题所在。此外,一旦你知道数据包长度,就没有必要复制t数组。复制是将缓冲区大小从1024减少到数据包大小。一旦知道实际数据包大小,就不需要复制。例如,`new String(packet.getData(),packet.getOffset(),packet.getLength());和“至于查找长度”,您已经找到了。答案完全不清楚。使用此代码为什么?仅代码不是答案。您必须解释。此特定代码的工作方式并不比OP的原始代码更好,因为它在语义上是相同的。
String sentence = new String(packet.getData()).trim();
System.out.println("Received: "+sentence);