2011-12-19 19 views
4

尝试将收到的DatagramPacket转换为字符串,但我遇到了一个小问题。不知道什么是最好的方式去做。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(对于这个例子),我走出来了就好了。

感谢。

回答

8
new String(buffer, 0, packet.getLength()) 
+0

不幸的是,没有工作。外面变得完全荒谬。而且eclipse还警告不推荐使用方法String(byte [],int)。当我初始化缓冲区的时候,它的确切长度是可以接收的,但一切都很好,但仍然存在相同的问题。字符串的长度不会事先知道。 – user1105216 2011-12-19 05:27:47

+0

这确实工作,但新的字符串(缓冲区,0,packet.getLength()); 非常感谢。 – user1105216 2011-12-19 05:45:44

2

的DatagramPacket类的长度字段给出实际收到的数据包的长度。请参阅javadocDatagramPacket.receive了解更多详情。

所以只需需要使用不同的String构造函数,传递字节数组和实际的re通过字节计数。

请参阅@jtahlborn或@ GiangPhanThanhGiang的答案。


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

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

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

+0

如果您打算投降,请解释为什么我可以在下次修复我的帖子。简单的投票并没有帮助。 – 2011-12-19 15:28:17

+2

你原来的答案没有提供任何有关获取包长度的有意义的信息,这基本上是问题所在。另外,一旦您知道数据包长度,就不需要复制数组。 – jtahlborn 2011-12-19 18:52:17

+0

复制是为了将缓冲区大小从1024减少到数据包大小。 – 2011-12-19 23:30:37

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

使用此代码为什么?单纯的代码不是答案。你必须解释。这个特定的代码不会比OP的原始代码更好,因为它在语义上是相同的。 – EJP 2017-01-07 06:06:38

1

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

0

尝试

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

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