2013-05-27 14 views
5

Sto creando un'applicazione client-server, in cui l'utente può accendere o spegnere il server da una GUI; per farlo funzionare, uso una classe annidata di SwingWorker. Tutto sembra funzionare correttamente, ma quando spengo il server e lo riaccendo non funziona, probabilmente perché c'è ancora un'altra istanza aperta che non può essere sovrascritta: il server è bloccato sull'accettazione () metodo. Voglio uccidere l'istanza precedente quando l'utente preme il pulsante di spegnimento, ma non so come.Come si elimina un'istanza di una classe in un'altra classe?

Ecco la classe SwingWorker che mi dà problemi:

class SwingWorkGUI extends SwingWorker 
    { 
     @Override 
     protected Integer doInBackground() throws Exception { 
      int delay = 1000; 
      final Timer time = new Timer(delay, null); 
      time.addActionListener(new java.awt.event.ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (Server.up == true){ 
         upTimeMillis += 1000; 
         long diff = upTimeMillis/1000; 
         long numHrs = diff/60; 
         diff = diff%60; 
         long numMins = diff/60; 
         long numSecs = diff%60; 
         upTime.setText(numHrs + ":" + numMins + ":" + numSecs); 
        } 
        else { 
         upTime.setText("Server Actually Down"); 
         time.stop(); 
        } 
       }   
      }); 
      time.start(); 
      mainServer = new Server(); 
      return null; 
     } 
    } 

Ogni volta che il pulsante Attiva viene premuto, l'actionPerformed determina se il server è già acceso o no, allora se non corre

SwingWorkGUI swg = new SwingWorkGUI(); 
swg.execute(); 

I blocchi di esecuzione nelle seguenti istruzioni, ma solo la seconda (terza, ecc.) Ora si chiama:

mainServer = new Server(); 

Server.up è una variabile statica che consente di eliminare il metodo while (true) nel server.

Come posso eliminare l'istanza aperta senza chiudere tutta l'applicazione?

+0

Se si esegue il server su un thread separato è possibile memorizzare un riferimento a quel filo e chiamare 'interrupt()' su di esso e poi ripulire il riferimento al server. Ciò dovrebbe causare il server per chiudere qualsiasi cosa stia facendo. (Probabilmente vorrai anche prendere 'InterruptedException' su' Server' e fare un po 'di pulizia interna, se necessario). – SamYonnou

+0

Chiama 'socket.close()' da un thread esterno per interrompere il metodo 'socket.accept()' e poi spegni il server: http://stackoverflow.com/questions/2983835/how-can-i-interrupt- a-ServerSocket-accetta-metodo – DannyMo

risposta

0

Se ho ben capito il tuo problema è che l'oggetto è bloccato sulla chiamata ServerSocket ed è necessario sbloccarlo. Alcune opzioni:

  1. chiamata ss.close() da un altro thread (si assume ss è il vostro ServerSocket oggetto). Questo farà sì che accept() lanci un SocketException. Riferimento: Javadocs for ServerSocket.close()

  2. Creare un nuovo Socket da un altro thread e connettersi al proprio server. Questo sbloccherà la chiamata accept(). Ora puoi controllare il tuo flag Server.up.

  3. Impostare un timeout su ServerSocket, ad es. 5 secondi. Questo farà sì che accept() lanci uno InterruptedIOException in timeout. Riferimento: Javadocs for SO_TIMEOUT

Problemi correlati