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没有收到我希望的。(因为我收到的实际字节长度不能修复整个数组)

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

4

3 回答 3

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

编辑添加字符集。谢谢,帕西法尔

于 2013-01-07T18:32:43.857 回答
2

javadocDatagramSocket.receive()

数据报包对象的长度字段包含接收到的消息的长度

然后,您可以String使用带有字节数组和偏移量的构造函数来构造您的构造函数。

于 2013-01-07T18:29:36.823 回答
2

调用DatagramPacket.getLength()以查明实际收到了多少字节。

并且当您String从这些字节构造时,请务必指定编码(实际上,您使用的是 JDK 默认编码,这可能与服务器的编码不同)。

于 2013-01-07T18:30:14.907 回答