2012-03-18 12 views
1

クライアントが特定の情報をサーバーに送信し、サーバーからの応答に応じてサーバークライアントプログラムを作成します。 複数のクライアントから継続的にリスンするために、クライアント要求を継続的にリッスンするサーバーにスレッドがあります。要求が受信されるたびに、別のスレッドを開始し、そのソケットを実行して送信し、他のクライアントの要求を待ち受けます。ここJavaのスレッドを殺す

は今、私の問題は、私は、サーバーをどのように停止することができるということです連続

while(true){ 
    //serverListener is a ServerSocket object 
    clientSocket = serverListener.accept();//Waiting for any client request 

    //New thread started when request is received from any client 
    Thread thread =new Thread(new serverThread(clientSocket), "ClientThread"); 
    thread.start(); 
} 

を聴くためのコードです。 whileループで変数を使用して値を変更する方法を知っていますが、その時点でスレッドが待機中にブール変数の値を変更してもサーバーを停止させることはありません。

この問題を解決する方法はありますか?

+0

1溶液を使用していることであるスローサーバーソケットのタイムアウトを設定し、サーバーが停止しているかどうかを確認するブール型変数を使用します。 – Zlatan

答えて

0

ServerSocket#setSoTimeout()は、タイムアウトに達した場合に受け入れを放棄します。 SocketTimeoutExceptionをキャッチすることに注意してください。

+0

タイムアウトは解決策の1つになる可能性がありますが、私はそれを止めたくありません。 – Zlatan

+1

ループにaccept()を入れることができます。タイムアウトが発生すると、停止が要求されたかどうかを確認しますもしそうでなければ、再びaccept()を実行します。 – PeterMmm

3

通常、serverListener(これは実際にはServerSocketなどと仮定しています)は別のスレッドによって閉じられています。これにより、accept()java.net.SocketExceptionが生成され、ループとスレッドが終了します。

final ServerSocket serverSocket = new ServerSocket(8000); 
new Thread(new Runnable() { 
    public void run() { 
     while (true) { 
      try { 
       serverSocket.accept(); 
      } catch (IOException e) { 
       return; 
      } 
     } 
    } 
}).start(); 
Thread.sleep(10000); 
serverSocket.close(); 
+0

私はこのアプローチを試していますが、IO例外がスローされますが、サーバはまだ動作しています。 – Zlatan

+0

@Meherzad「まだサーバーが動作しています」とはどういう意味ですか?ソケットは、閉じた後にポートにバインドしないでください。スレッドがまだ実行中であることを意味しますか?プログラムはシャットダウンしませんか? – Gray

+0

setDaemon(true)を設定してみてください。それを開始する前にサーバー受け入れスレッドで呼び出します。クライアント/サーバスレッドは、デーモンスレッドにもなります。その後、サーバーアプリは終了する必要があります。 –

0
volatile boolean finishFlag = false; 

while(true){ 

      clientSocket = serverListener.accept();//Waiting for any client request 

      if (finishFlag) 
       break; 

      //New thread started when request is received from any client 
      Thread thread =new Thread(new serverThread(clientSocket), "ClientThread"); 
      thread.start(); 
} 

EDIT:

リスナーを中断するため、あなたは外からこのスレッドを停止してから、受け入れるべき()意志私が見つけたのIOException

try { 
     while (true) { 
     Socket connection = server.accept(); 

     try {  
      // any work here  
      connection.close(); 
     } 
     catch (IOException ex) { 
     // maybe the client broke the connection early. 
     } 

     finally { 
     // Guarantee that sockets are closed when complete. 
     try { 
      if (connection != null) connection.close(); 
     } 
     catch (IOException ex) {} 
    }  
    }  
    catch (IOException ex) { 
    System.err.println(ex); 
    } 
+0

新しいクライアントが受信されたときにクライアント要求が受信されるまでaccept()で待機し続けると、それだけが次の行に移動します。私はこの事件を試みたが、この問題についても言及した。 – Zlatan

関連する問題