(Java) Получение пакетов из одного и того же сокета в нескольких потоках одновременно - PullRequest
0 голосов
/ 01 апреля 2020

Я пишу программу, которая:

  1. Отправляет пакеты ping другим процессам, выполняющим ту же программу

  2. Процесс отправляет ответ на пинг с (1)

  3. Если процесс не получает ответ в течение X секунд, затем вызвать метод для обновления состояний

Так что в настоящее время у меня есть только сокет 1 Datagram, который обрабатывает как отправку, так и прием пакетов. То, как я обрабатывал таймаут ping, вызывало setSoTimeout в сокете и блокировало receive сразу после отправки пакета ping другому процессу.

public MyProgram {

    private DatagramSocket socket;

    public MyProgram() {

        socket = new DatagramSocket("localhost", 12345);

        Thread sendingThread = new Thread(new Runnable() {
            public void run() {
                // call sendLoop method
            }
        }
        Thread receiveThread = new Thread(new Runnable() {
            public void run() {
                // call receiveLoop method
            }
        }
    }

    public void sendLoop() {
        while (true) {

            /*
            send ping to other process
            */

            // now wait until it replies with ACK

            try {
                socket.receive(...);
            } catch (SocketTimeoutException e) {
                // call method to update state
            }
        }
    }

    // ... more code ...
}

Теперь проблема в том, что я пишу receiveLoop (отдельный поток для sendLoop), который ожидает входящих пакетов ping от других процессов

public void receiveLoop() {
    while (true) {
        socket.receive(...);

        // call methods to reply to the ping
    }
}

Как я могу ждать ответа на свой собственный ping, ожидая при этом входящих пингов в другом потоке? Я полагал, что такой подход будет плохим, потому что ответ на эхо-запрос может поступить в другой поток? Можно ли одновременно вызывать receive на одном и том же сокете UDP в разных потоках?

Есть ли способ решить эту проблему без необходимости создания другого сокета UDP? Большое спасибо!

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