2013-01-07 33 views
1

我正在使用字节数组来存储从另一台计算机接收到的数据包。字节数组:如何确切知道接收到的字节数

receivedData = new byte[1024]; 
receivedPacket = new DatagramPacket(receivedData, receivedData.length); 
socket.receive(receivedPacket); 
receivedData = receivedPacket.getData(); 
String res = new String(receivedData); // PROBLEM HERE 

问题是在最后一行:因为我宣布receivedData与长度1024这样一个字节流,总是在最后一行将创建一个从整个阵列的新字符串,虽然它不知道到底有多少真正的我收到的字节。所以,我遇到了沮丧的错误:res没有收到,因为我希望。 (因为我收到的实际字节长度不能修复整个阵列)

所以,我的问题是:我该如何解决这一问题,我怎么知道我真的收到了多少字节转换为字符串?

+0

最初我认为你可以把receivedPacket放入一个对象中,然后根据被转换为byte []的对象的长度来创建字节数组。之后创建字符串。 –

回答

4

尝试使用DatagramPacket.getLength()

receivedData = new byte[1024]; 
receivedPacket = new DatagramPacket(receivedData, receivedData.length); 
socket.receive(receivedPacket); 
receivedData = receivedPacket.getData(); 
String charsetName = "US-ASCII"; // set to desired charset 
String res = new String(receivedData, 0, receivedPacket.getLength(), charsetName); 

编辑添加字符集。谢谢,parsifal

+1

请注意,这在创建字符串时依赖于默认编码,这可能是难以解决错误的根源。 – parsifal

2

javadocDatagramSocket.receive()

The length field of the datagram packet object contains the length of the received message

可以使用,需要一个字节数组和偏移量构造,然后构建你的String

2

请致电DatagramPacket.getLength()找出实际收到的字节数。

而当你从这些字节构建String一定要指定编码(因为它是,你正在使用JDK的默认编码,可以从服务器的编码方式不同)。