2013-05-27 20 views
5

私は、ユーザーがGUIからサーバーをオンまたはオフにできるクライアントサーバーアプリケーションを作成しています。それを動作させるために、私はSwingWorkerネストされたクラスを使用します。 すべて正常に動作しているようですが、サーバーの電源を切って再度電源を入れても機能しない場合は、おそらく上書きできないインスタンスが存在するためです。サーバーは受け入れ時にブロックされます) 方法。 ユーザーがスイッチをオフにしたときに前のインスタンスを強制終了したいが、どうすればよいか分からない。ここで別のクラスのクラスのインスタンスを削除するにはどうすればよいですか?

は私に問題を与えて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; 
     } 
    } 

ボタンをオンを押すと、actionPerformedのサーバが上か、すでにあるかどうかを判断し、その後、

SwingWorkGUI swg = new SwingWorkGUI(); 
swg.execute(); 
を実行している場合ではありません

実行ブロックは次の命令で呼び出されますが、呼び出されるのは2回目(3回目)です。

mainServer = new Server(); 

Server.upはサーバーのwhile(true)メソッドを強制終了するのに役立つ静的変数です。私はすべてのアプリケーションを閉じずに開いているインスタンスを殺すことができる方法

+0

あなたはそのスレッドへの参照を格納し、それに '割り込みを()'を呼び出した後、サーバーへの参照をクリーンアップすることができます別のスレッドでサーバーを実行している場合。これにより、サーバーは何をしていても終了するはずです。 (おそらく、 'Server'で' InterruptedException'をキャッチし、必要に応じて内部クリーンアップを行いたいと思うでしょう)。 – SamYonnou

+0

'socket.accept()'メソッドを中断してサーバーをシャットダウンするには、外部スレッドから 'socket.close()'を呼び出す:http://stackoverflow.com/questions/2983835/how-can-i-interrupt- a-serversocket-accept-method – DannyMo

答えて

0

私が正しく理解しているのは、ServerSocketオブジェクトがaccept()コールでブロックされているため、そのブロックを解除する必要があるということです。いくつかのオプション:

  1. 別のスレッドからのコールss.close()は(ssがあなたのServerSocketオブジェクトであると仮定し)。これによりaccept()SocketExceptionにスローされます。参照:Javadocs for ServerSocket.close()

  2. 別のスレッドから新しいSocketを作成し、独自のサーバーに接続します。これにより、accept()コールのブロックが解除されます。これであなたのServer.upフラグを確認できます。例えば、あなたのServerSocketにタイムアウトを設定し

  3. 5秒。これにより、accept()がタイムアウト時にInterruptedIOExceptionにスローされます。参考:Javadocs for SO_TIMEOUT

関連する問題