Исключение при разборе 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());
Другие вопросы по тегам