我开始感到非常愚蠢 - 希望这个问题得到一个简单的答案。
我正在尝试通过UDP发送Point对象的坐标。发送效果很好:
public void send(Point p) throws IOException {
String data = Integer.toString(p.x) + " " + Integer.toString(p.y);
InetAddress IPAddress = InetAddress.getByName(this.remoteHost);
byte[] sendData = new byte[1024];
sendData = data.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, this.remotePort);
socket.send(sendPacket);
}
我可以在另一端收到数据:
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
this.socket.receive(receivePacket);
正如您可能会看到我发送字符串“X Y”,例如“329 456”。我现在需要将这些值解析为整数,所以我可以在另一端使用它们:
String[] parts = data.split(" ");
int x = Integer.parseInt(new String(parts[0]));
int y = Integer.parseInt(new String(parts[1]));
但是这给了我y整数的NumberFormatException(“For input string:'456'”)。为什么?这里有什么我想念的吗?我一直在考虑他发送的字符的实际编码 - 这可能是为什么Integer不理解这个值的原因?
感谢您的帮助。
答案 0 :(得分:0)
我猜您在将数据包数据转换为String
时不会考虑数据包长度。
你应该按如下方式进行:
String data = new String(receivePacket.getData(), 0, receivePacket.getLength());
此外,最好在发送和接收消息时明确指定字符编码,以防止机器具有不同的默认编码时出现问题:
sendData = data.getBytes("UTF-8");
...
String data = new String(receivePacket.getData(), 0, receivePacket.getLength(), "UTF-8");
答案 1 :(得分:0)
您是否以这种方式阅读数据?
String data = new String(receivePacket.getData(), 0, receivePacket.getLength());