Я пишу программу, которая:
Отправляет пакеты ping другим процессам, выполняющим ту же программу
Процесс отправляет ответ на пинг с (1)
Если процесс не получает ответ в течение 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? Большое спасибо!