как остановить этот метод?Java MulticastSocket. Как остановить/приостановить метод «получать»
multSocket.receive(multPacket);
Я пытаюсь подключить две или более машины (или приложения на одной машине) через UDP Multicast с Java. Дело в том, что я не работаю с клиентским сервером, а скорее как распределенный объект, поэтому на самом деле нет разницы между клиентами и серверами.
В идеальном случае первое открытое приложение начнет отправлять многоадресные сообщения каждые x секунд, а когда другой будет запущен, вызывается метод приема сообщения или пакета. Но поскольку каждое приложение может быть клиентом или сервером, сложно понять, какой из них нужно отправить, а другой - получать.
Моя текущая идея для исправления этого заключается в том, чтобы каждое приложение отправляло пакет многоадресной рассылки на 10 секунд, если никто не отвечает, а затем прослушивайте многоадресные пакеты в течение 10 секунд, если он не получает ничего, чтобы начать отправку снова и сохранить цикл , Когда один из них, наконец, получит сообщение, отправьте подтверждение отправителю, и оба из них могут прекратить прослушивание и отправку.
Но моя проблема - метод получения. Он продолжает прослушивать входящие многоадресные пакеты, и я не знаю, как остановить или приостановить его.
Это, как я инициализировать сокет только в случае
MulticastSocket multSocket = new MulticastSocket(5001);
multSocket.joinGroup(230.0.0.1);
private byte[] multBuf = new byte[256];
DatagramPacket multPacket = new DatagramPacket(multBuf, multBuf.length);
Спасибо за слушание меня.
---------------------------------------------- ---------------- РЕДАКТИРОВАТЬ --------------------------------- -----------------------------
----------------- --------------------------------------------- РЕДАКТИРОВАТЬ ---- -------------------------------------------------- --------
@EJP Спасибо за ваш ответ! Это, как я реализовал setSoTimeout на получение группового метода:
public void receiveMulticast() throws IOException{
multAddress = InetAddress.getByName("230.0.0.1");
multSocket = new MulticastSocket(multPort);
multSocket.joinGroup(multAddress);
multBuf = new byte[256];
multPacket = new DatagramPacket(multBuf, multBuf.length);
multSocket.setSoTimeout(10000);
try {
// This is the sentence I had trouble with
multSocket.receive(multPacket);
receivedPacket = true;
System.out.println("Received something");
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
}
}
Вот больше кода в случае, если кто-то любопытно:
Это мой метод групповой отправки, который использует сон для отправки каждые 10 секунд:
public void sendMulticast() throws IOException, InterruptedException{
multAddress = InetAddress.getByName("230.0.0.1");
multSocket = new MulticastSocket();
multSocket.joinGroup(multAddress);
int tcpPort = 5001;
String data = String.valueOf(tcpPort);
multBuf = data.getBytes();
multPacket = new DatagramPacket(multBuf, multBuf.length, multAddress, multPort);
int count = 0;
while (count < 10) {
Thread.sleep(1000);
multSocket.send(multPacket);
count++;
}
}
И это, где я называю эти два метода infinitetly (на другой класс):
messageThread = new Thread() {
@Override
public void run() {
while(true){
try {
stateLabel.setText("Sending");
socket.sendMulticast();
stateLabel.setText("Listening");
socket.receiveMulticast();
} catch (IOException ex) {
Logger.getLogger(NumerosAmigosView.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(NumerosAmigosView.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};
messageThread.start();
Таким образом, в результате программа запускает бесконечную посылку пакета на 10 секунд, получая его в течение 10 секунд и начинающего. Когда у меня есть две программы, запущенные одновременно, пакеты получаются :).
Ваш ответ помог. У меня новое сомнение больше, чем проблема, потому что программа работает нормально. Я отредактировал свой вопрос и добавил код. Этот код был сделан путем изменения простой связи с клиентским сервером, а на стороне messageThread перед вызовом sendMulticast или receiveMulticast она имела следующую строку: Thread.currentThread().прерывания(); Который я должен был удалить, потому что это испортило мое предложение сна. Как эта строка помогает в моем коде? Должен ли я попытаться реализовать его по-другому? Или, может быть, добавьте multSocket.setSoTimeout (10000) вместо сна (я пробовал этот и не мог заставить его работать). – Adocad
@somezombie Зачем вообще спать? не говоря уже о прерывании? Просто придерживайтесь того, что он говорит в моем ответе. – EJP