2012-03-12 27 views
1

私はJavaでネットワークサーバーを作成していますが、私はそれには小さな問題があります。コメントで言ったように、私は次の上/フリップ/変数this.Listeningの値を変更し、ループは停止しませんが、終了を否定するならば、今すぐJavaループの終了条件

import java.io.IOException; 
import java.net.ServerSocket; 
/** 
* Another flavor of the server module. 
* According to GOD (also known as Joshua Bloch) this is the proper 
* implementation of a singleton (Note: serialization). 
* 
* @author estol 
*/ 
public enum EnumSingletonServer implements ServerInterface, Runnable 
{ 
    SERVER; 
    private ServerSocket serverSocket = null; 
    private boolean Listening   = true; 

    @Override 
    public void bind() { 
     this.bind(DEFAULTPORT); 
    } 

    @Override 
    public void bind(int Port) { 
     try { 
      this.serverSocket = new ServerSocket(Port); 
     } catch (IOException ioe) { 
      System.err.printf("Cannot bind to port %d\nAdditional information:\n%s\nExiting\n", Port, ioe.getMessage()); 
      System.exit(1); 
     } 
    } 

    /** 
    * Not that elegant, but does not work with flipping the switch, because 
    * the loop (in public void run()) is only running when there is an incoming connection(?). 
    * 
    * 
    * FIXME 
    */ 
    @Override 
    public void shutdown() { 
     // this.Listening = !this.Listening; // FIXME 
     System.exit(0); 

    } 
    /** 
    * Accepting connections on the port, we are bound to. 
    * The main loop of the server is a bit broken. Does not exit, 
    * if we flip the value of this.Listening, but exit on the next incoming 
    * connection. This is a problem. 
    * 
    * FIXME 
    */ 
    @Override 
    public void run() { 
     try { 
      System.out.printf("Listening on %d\n", this.serverSocket.getLocalPort()); 
      Thread.currentThread().setName("ServerThread"); 
      // FIXME 
      do { 
       new Thread(new ServerWorkerThreads(this.serverSocket.accept(), 3)).start(); 
      } while (this.Listening); 

      this.serverSocket.close(); 
      System.exit(0); 
     } catch (IOException ioe) { 
      System.err.printf("Cannot accept on, or close port %d\nAdditional information:\n%s\nExiting\n", this.serverSocket.getLocalPort(), ioe.getMessage()); 
      System.exit(1); 
     } 
    } 
} 

: コードが話をしましょう接続。

最初は列挙子にサーバーを実装していませんでしたが、シリアライズ後にシングルトンにならなかったクラスで実行しましたが、それは期待通りに実行されました。私はしばらくして(条件)やdo while(条件)ループを試しました。

すべてのサポートをいただければ幸いです。あなたのシャットダウン方法では

+2

あなたは変更をすべてのスレッドから見ることができるように 'volatile 'を聞いてみましたか? – assylias

+1

serversocketブロック内のaccept()メソッド。新しい接続を待っている間にループが実行されていません。新しい接続を受信した後に続行するかどうかのみをチェックします。私はあなたが欲しい振る舞いをどうやって得るかについてはあまりよく分かりません。 – Steven

+0

揮発性で解決しました。ありがとう! –

答えて

1

だけで変数を設定するのではなく、ソケットを閉じます。

this.serverSocket.close() 

これは受け入れループにのSocketExceptionを発生させますし、ループが停止する予定です。

+0

実際にはこれもうまくいくでしょうが、例外を処理して終了したい場合、私は出発点にかなり戻っています。 (System.out.printf( "正常終了!\ n"); System.exit(0)})ちょうどaまったく同じことをする長い道のり。 –

+2

+1 @estolこのライブラリを使用して単体テストを実行している場合は、テストを完了してステータスを与え、テストを続行することをお勧めします。プロセスが死ぬだけではそれほど有用ではありません。注意:本番環境ではプロセスを終了させる可能性がより高いので、shutdown()はテストでのみ有効です。 –