2015-11-09 11 views
5

seguito di classe è quello di lanciare un ascoltatore UDP:JavaFX palco non rispondere dopo l'azione sul pulsante

public class Client extends Application { 

UdpListener udp = new UdpListener(); 

public static void main(String[] args) { 

    Application.launch(); 
} 

@Override 
public void start(Stage stage) { 

    HBox root = new HBox(); 
    Button startListeningButton = new Button("START LISTEN"); 
    Button stopListeningButton = new Button("STOP LISTEN"); 
    Scene scene = new Scene(root); 
    root.setSpacing(10); 
    root.getChildren().addAll(startListeningButton, stopListeningButton); 

    EventHandler<MouseEvent> handlerStartListen = event -> { 

     try { 
      udp.run(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }; 

    EventHandler<MouseEvent> handlerStopListen = event -> { 
     // 
    }; 

    startListeningButton.addEventFilter(MOUSE_CLICKED, handlerStartListen); 
    stopListeningButton.addEventFilter(MOUSE_CLICKED, handlerStopListen); 

    stage.setScene(scene); 
    stage.setTitle("SNIFFER"); 
    stage.show(); 
    stage.sizeToScene(); 

} 

Sotto UdpListener:

public class UdpListener implements Runnable { 

    private final Integer LIST_PORT = 30000; 
    private final Integer UDP_SIZE = 1472; 

    private DatagramSocket socket; 
    private DatagramPacket receivingPacket; 


    public void run() { 
     try { 

      socket = new DatagramSocket(LIST_PORT); 
      doProcessing(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public void doProcessing() throws IOException { 


     while (true) { 

      String checkAsterix; 
      String asterixPackData; 
      byte buff[] = new byte[UDP_SIZE]; 

      receivingPacket = new DatagramPacket(buff, buff.length); 

      socket.receive(receivingPacket); 
      buff = receivingPacket.getData(); 

      asterixPackData = new Decode(buff).getHexString(); 
      checkAsterix = asterixPackData.substring(0, Math.min(asterixPackData.length(), 2)); 

      Integer i = Integer.decode("0x" + checkAsterix); 

      switch (i) { 

       case (48): 
        new ShowMessage("TROVATO"); 
        //new atxlib.... 
        break; 

       default: 
        new ShowMessage("SCARTO"); 
        break; 
      } 
     } 
    } 
} 

UdpListener è un'altra classe che basta aprire un socket per annusare tutte le dati sulla porta XXXX e decodificarli.

Posso avviare direttamente il UdpListener. Ma se collego questo inizio al codice sopra l'applicazione sembra bloccata anche se funziona.

quando si sposta il cursore del mouse sul tavolino, si passa a "caricamento". Nel frattempo il monitor dell'attività dice "java non risponde".

Qualche suggerimento?

+0

È necessario mostrare cosa fa UdpListener'. –

+0

UdpListener è un processo di lunga durata? In questo caso, stai congelando la GUI perché stai eseguendo tutto sul thread dell'applicazione. –

+0

Ho appena aggiornato la mia domanda con la classe UdpListener –

risposta

2

Stai bloccando il thread dell'interfaccia utente con un ciclo infinito. Se lo fai, l'interfaccia utente smette di rispondere. È necessario eseguire tale corsa lunga da un thread diverso:

sostituire

try { 
    udp.run(); 
}catch (Exception e) { 
    e.printStackTrace(); 
} 

con

new Thread(udp).start(); 

e utilizzare Platform.runLater per aggiornare l'interfaccia utente del nuovo thread, se necessario.

+0

ok funziona, grazie mille. –

Problemi correlati