Исключение при разборе int из String после того, как он был отправлен с дейтаграммой
Я начинаю чувствовать себя очень глупо - и, надеюсь, на этот вопрос есть простой ответ.
Я пытаюсь отправить координаты объекта Point через UDP. Отправка прекрасно работает:
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]));
Но это дает мне NumberFormatException для целого числа y ("Для входной строки:" 456 "). Зачем? Есть ли что-то, что я здесь скучаю? Я думал о фактической кодировке отправляемых символов - может ли это быть причиной того, что Integer не поймет значение?
Спасибо за любую помощь.
2 ответа
Я полагаю, вы не учитываете длину пакета при преобразовании данных пакета в 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");
Вы читаете данные таким образом?
String data = new String(receivePacket.getData(), 0, receivePacket.getLength());