2013-05-27 3 views
5

Я делаю клиент-серверное приложение, в котором пользователь может включить или отключить сервер от gui; чтобы он работал, я использую вложенный класс SwingWorker. Все, кажется, работает правильно, но когда я выключаю сервер и снова включаю его, он не работает, возможно, потому что есть еще один открытый экземпляр, который нельзя перезаписать: сервер заблокирован на accept (). Я хочу убить предыдущий экземпляр, когда пользователь нажимает кнопку отключения, но я не знаю, как это сделать.Как убить экземпляр класса в другом классе?

Вот класс SwingWorker, который дает мне проблемы:

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; 
     } 
    } 

Everytime Включить кнопки нажимается, то actionPerformed определяет, является ли сервер уже или нет, то, если не работает

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

Выполнение блоков в следующей инструкции, но только второе (третье, ecc.) Время, которое оно вызывается:

Server.up - статическая переменная, которая помогает мне убить метод while (true) на сервере.

Как я могу убить открытый экземпляр, не закрывая все приложение?

+0

Если вы используете сервер в отдельном потоке вы можете сохранить ссылку на эту нить и вызвать 'прерывания()' на него, а затем очистить ссылку на сервер. Это должно заставить сервер отказаться от всего, что он делает. (Вероятно, вы также захотите поймать 'InterruptedException' на 'Server' и выполнить некоторую внутреннюю очистку по мере необходимости). – SamYonnou

+0

Вызовите 'socket.close()' из внешнего потока, чтобы прервать метод 'socket.accept()', а затем выключите ваш сервер: http://stackoverflow.com/questions/2983835/how-can-i-interrupt- а-ServerSocket-Accept-метод – DannyMo

ответ

0

Если я правильно понял, ваша проблема в том, что объект ServerSocket заблокирован по вызову accept(), и вам необходимо разблокировать его. Некоторые опции:

  1. Вызов ss.close() из другого потока (предполагается, ss Ваш ServerSocket объект). Это сделает accept() бросить SocketException. Ссылка: Javadocs for ServerSocket.close()

  2. Создайте новый Socket из другого потока и подключитесь к своему собственному серверу. Это разблокирует вызов accept(). Теперь вы можете проверить свой флаг Server.up.

  3. Установите тайм-аут на ServerSocket, например. 5 секунд. Это сделает accept() бросить InterruptedIOException по истечении интервала. Справка: Javadocs for SO_TIMEOUT

Смежные вопросы