NumberFormatException при преобразовании данных, передаваемых от клиента к серверу с помощью udp - PullRequest
0 голосов
/ 22 сентября 2019

В моем клиентском классе есть следующий код:

private void onCalculateClick() {
    try {
        DatagramSocket socket = new DatagramSocket(12346);
        DatagramPacket datagramPacket;
        InetAddress local = InetAddress.getByName("localhost");
        byte[] bytes;

        bytes = aTf.getText().getBytes();
        datagramPacket = new DatagramPacket(bytes, bytes.length, local, 12345);
        socket.send(datagramPacket);

        bytes = bTf.getText().getBytes();
        datagramPacket = new DatagramPacket(bytes, bytes.length, local, 12345);
        socket.send(datagramPacket);

        bytes = cTf.getText().getBytes();
        datagramPacket = new DatagramPacket(bytes, bytes.length, local, 12345);
        socket.send(datagramPacket);

        datagramPacket = new DatagramPacket(bytes, bytes.length);
        socket.receive(datagramPacket);

        resultTf.setText(new String(datagramPacket.getData()));
        socket.close();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

Как вы видите, здесь я передаю данные из JTextFields на сервер и жду ответа.По умолчанию данные равны 2 в ATF, 8 в bTf и 11 в CTF (возможно, это поможет).А вот код моего сервера:

public class UpdServer {
    private double sum1 = 0;
    private double sum2 = 0;
    private byte[] bytes = new byte[100];
    private DatagramSocket socket;
    private DatagramPacket datagramPacket = new DatagramPacket(bytes, 100);

    public static void main(String[] args) {
        new UpdServer();
    }

    private UpdServer() {
        try {
            socket = new DatagramSocket(12345);
            listen();
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    private void listen() {
        int a, b, c;
        try {
            socket.receive(datagramPacket);
            String str = new String(datagramPacket.getData());
            System.out.println(str);
            a = Integer.parseInt(str);

            socket.receive(datagramPacket);
            str = new String(datagramPacket.getData());
            System.out.println(str);
            b = Integer.parseInt(str);

            socket.receive(datagramPacket);
            str = new String(datagramPacket.getData());
            System.out.println(str);
            c = Integer.parseInt(str);

            Thread firstSumThread = new Thread(() -> {
                for (int i = a; i < b; i++) {
                    sum1 += (i - 1) * (i - 1);
                }
            });

            Thread secondSumThread = new Thread(() -> {
                for (int i = b; i < c; i++) {
                    sum2 += (double) 2 * i / (7 * i + 1);
                }
            });

            firstSumThread.start();
            secondSumThread.start();
            firstSumThread.join();
            secondSumThread.join();
            sendBack();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void sendBack() {
        String str = String.valueOf(sum1 - sum2);
        byte[] send = str.getBytes();
        try {
            datagramPacket = new DatagramPacket(send, send.length, InetAddress.getByName("localhost"), 12346);
            socket.send(datagramPacket);
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Но когда я запускаю сервер, клиент, нажимаю на кнопку Рассчитать, я получаю следующую ошибку:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2                                                                                                   "
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.base/java.lang.Integer.parseInt(Integer.java:652)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)
    at com.mikhailovskii.lab2.udp.UpdServer.listen(UpdServer.java:37)
    at com.mikhailovskii.lab2.udp.UpdServer.<init>(UpdServer.java:25)
    at com.mikhailovskii.lab2.udp.UpdServer.main(UpdServer.java:19)

Итак, какЯ понимаю, это происходит после преобразования первого переданного String в int, но я не могу понять, почему.Итак, в чем дело и как я могу решить эту проблему?

1 Ответ

2 голосов
/ 22 сентября 2019

Проблема в том, что ваша строка содержит конечные пробелы: "2 ".Следовательно, NumberFormatException возникает при попытке преобразовать его в целое число.

Вы можете добавить функцию .trim() в свои строки, чтобы исключить начальные и конечные пробелы.

String str = new String(datagramPacket.getData());
if (str != null) {
    str = str.trim();
}
a = Integer.parseInt(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...