2014-10-12 1 views
0

как остановить этот метод?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 секунд и начинающего. Когда у меня есть две программы, запущенные одновременно, пакеты получаются :).

ответ

1

Установите тайм-аут чтения с setSoTimeout() и поймайте SocketTimeoutException, который выбрасывается.

+0

Ваш ответ помог. У меня новое сомнение больше, чем проблема, потому что программа работает нормально. Я отредактировал свой вопрос и добавил код. Этот код был сделан путем изменения простой связи с клиентским сервером, а на стороне messageThread перед вызовом sendMulticast или receiveMulticast она имела следующую строку: Thread.currentThread().прерывания(); Который я должен был удалить, потому что это испортило мое предложение сна. Как эта строка помогает в моем коде? Должен ли я попытаться реализовать его по-другому? Или, может быть, добавьте multSocket.setSoTimeout (10000) вместо сна (я пробовал этот и не мог заставить его работать). – Adocad

+0

@somezombie Зачем вообще спать? не говоря уже о прерывании? Просто придерживайтесь того, что он говорит в моем ответе. – EJP