Сервер не получает сообщение клиента - PullRequest
0 голосов
/ 22 сентября 2018

Я новичок в программировании сокетов Java и пытаюсь написать программу, которая должна работать на 2 отдельных контроллерах.Я написал поток, который используется в качестве класса связи.

Я определил флаг с именем SFlag, чтобы при изменении значения этого флага на 1 в любом месте моей программы соответствующий контроллер отправлял приветственное сообщение другому контроллеру через функцию sendPackets ().Другой контроллер получит это сообщение через класс ReceivePackets и распечатает результат.Вот код:

// My UDP communication class
    public class MainConn implements Runnable {

        // Sockets, 1 for sending, and one for receiving
        DatagramSocket socket1, socket2;

        // localIP
        private InetAddress localIP;
        private InetAddress leaderIP;

        // classes to run on separate Threads
        private ReceivePackets rcvThread;


        @Override
        public void run() {
            process();
        }

        public void process() {

            // initialize some parameters
            init1();

            // Make Thread for receiving packets and update counters from all
            // controller
            rcvThread = new ReceivePackets();
            Thread r = new Thread(rcvThread);
            r.start();

            sendPackets();
        }

        public void init1() {
            try {
                // create sockets
                String tempString = config.get("localPort");
                localPort = Integer.parseInt(tempString);
                logger.info("----------here is==========" +localPort);

                leaderIP = InetAddress.getByName("127.0.0.1");
                logger.info("----------here is==========" +leaderIP);

                socket1 = new DatagramSocket(localPort); // for sending
                socket2 = new DatagramSocket(localPort + 1); // for receiving
            } catch (SocketException | UnknownHostException e) {
                e.printStackTrace();
            }
        }


        //*******************************************************

        public void sendPackets() {
            // will be used to begin sending message type II after 3*hello
            // period

            while (true) {
                try {

                    // if network not converged, send message type I, contains:
                    // type number (1) then
                    if (SFlag == 1) {               
                        logger.info("Sending the message");
                        String tempString = new String("Hello");

                        byte[] data = tempString.getBytes();                
                        DatagramPacket sentPacket = new DatagramPacket(data, tempString.length());
                        sentPacket.setAddress(leaderIP);
                        sentPacket.setPort(20222);
                        socket1.send(sentPacket);
                        SFlag = 0;
                    }
                    else {
                        logger.info("Nothinggggggggggggg");
                    }

                    Thread.sleep(5000);// wait for Hello period

                } catch (SocketException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                catch(Exception e){
                    e.printStackTrace();
                }

            }
        }

        class ReceivePackets implements Runnable {

            @Override
            public void run() {
                try {
                    while (true) {
                        logger.info("---------------waiting------------------");
                        byte[] data = new byte[1000];
                        DatagramPacket receivedPacket = new DatagramPacket(data, data.length);
                        socket2.receive(receivedPacket);
                        String senderIP = receivedPacket.getAddress().getHostAddress();
                        String senderPort = "" + receivedPacket.getPort();
                        String message = new String(data, 0, receivedPacket.getLength());
                        logger.info(message);

                        System.out.println("Received Message: "+message);
                        }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
    }

Когда значение SFlag изменяется на 1, кажется, что первый контроллер отправляет сообщение (печатается «Отправка сообщения»), но, кажется, естьпроблема с получением сообщения на втором контроллере, потому что полученное сообщение не печатается.

В чем проблема?

1 Ответ

0 голосов
/ 22 сентября 2018

Есть некоторые проблемы с вашим кодом:

(1) Поскольку оба потока используют SFlag для связи, убедитесь, что он объявлен с ключевым словом volatile:

private volatile int SFlag = 0;

Ключевое слово volatile предотвращает кэширование переменной, поэтому оба потока будут постоянно видеть одно и то же значение.Кроме того, операции чтения и записи для переменных volatile являются атомарными.

(2) В этой строке указан номер порта с жестким кодом:

sentPacket.setPort(20222);

Makeубедитесь, что это номер порта, используемый потоком ReceivePackets.В идеале мы никогда не должны смешивать магические числа с кодом.Поэтому вам следует переместить этот номер порта в отдельную переменную или константу.

(3) В Java не следует создавать String с new.Например, это плохая практика:

String tempString = new String("Hello"); // bad practice

Вы должны сделать:

String tempString = "Hello";

Мой последний совет: очистите ваш код .Вы можете посмотреть руководство Oracle по отправке и получению пакетов дейтаграмм здесь: https://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...