尝试将收到的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(对于这个例子),我的出来就好了。
感谢。
答案 0 :(得分:8)
new String(buffer, 0, packet.getLength())
答案 1 :(得分:2)
DatagramPacket的长度字段给出了实际收到的数据包的长度。有关详细信息,请参阅DatagramPacket.receive
的{{3}}。
所以你只需要使用不同的String
构造函数,传递字节数组和实际接收的字节数。
例如,请参阅@jtahlborn或@ GiangPhanThanhGiang的答案。
然而,在将字节解码为UTF-16字符串时,仍然存在应该使用哪种字符编码的问题。对于您的特定示例,它可能无关紧要。但是,如果您传递的数据可能包含非ASCII字符,那么您需要使用正确的字符集进行解码。如果您出错,您可能会在String
值中出现乱码。
答案 2 :(得分:2)
使用此代码:
String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());
答案 3 :(得分:0)
据我了解,DatagramPacket最后只有一堆垃圾。正如斯蒂芬C.建议的那样,你或许可以找到收到的实际长度。在这种情况下,请使用:
int realSize = packet.getLength() //Method suggested by Stephen C.
byte[] realPacket = new byte[realSize];
System.arrayCopy(buffer, 0, realPacket, 0, realSize);
至于查找长度,我不知道。
答案 4 :(得分:0)
尝试
System.out.println("Received: "+new String(buffer).trim());
或
String sentence = new String(packet.getData()).trim();
System.out.println("Received: "+sentence);
答案 5 :(得分:-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);