2017-07-10 11 views
1

私の小さな問題を見ていただきありがとうございます。JavaソケットServerSide入力

最近私はJavaソケットに入って、マルチクライアントのチャットアプリケーションのチュートリアルを参照しました。http://cs.lmu.edu/~ray/notes/javanetexamples/ページの最後の例です。

それはうまく動作しますが、サーバー側の入力も処理したいと思います。特定のユーザーがコマンドなどで切断したり、サーバーのコンソールでユーザーの入力を「聞いて」いるだけで、頭が折れるようですこの特定のケースでは、

try { 
     while (true) { 
      new Handler(listener.accept()).start(); 
     }    
    } 

私はちょうど、ユーザーが>悪い接続するまで、それはユーザの入力を待ちますtryブロック内でユーザ入力をチェックすると、私は、コマンドが入力されるまで、彼の通常のループでサーバーを維持したいです。

この単純な例でもこれを行う方法はありますか、ハンドラをループしている間にユーザーの入力を待ち受けるために余分なスレッドが必要ですか?もしそうなら、どうすればよいでしょうか? は、別のスレッドを使用して問題を解決した:

public class HandleClientsThread extends Thread{ 

private static int PORT; 

public HandleClientsThread(int port) { 
    this.PORT = port; 
} 

public void run() { 
    try { 
     System.out.println("Handle Clients Thread Start"); 
     ServerSocket listener = new ServerSocket(PORT); 
     try { 
      while (true) { 
       new Client(listener.accept()).start(); 
      }    
     } finally { 
      listener.close();   
     } 
    } catch(IOException e) { } 
}   
: は、まず新しい接続をリッスン新しいスレッドを処理するための新しいクラスを追加


はEDIT)=任意の助けに感謝

}

メインサーバーで行う必要があったのは、スレッドを開始して、バックグラウンドで実行できるようにすることでしたユーザーの入力をiting:

public static void main(String[] args) throws Exception { 
    System.out.println("----- Server running on Port " + PORT + " -----"); 

    new HandleClientsThread(PORT).start();  

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    while(true) { 
     String cmd = br.readLine(); 
     switch (cmd) { 

誰が違反のような本で何か問題いくつかのプログラミングパターンや、それをこのように行っている間に起こる可能性が悪いものを見ている場合、私はそれを感謝=)

答えて

-1

は、別のスレッドのようになりますあなたにとって最も管理しやすいオプションです。

もう1つの方法は、別の操作を実行し、完了したときにスレッドを再開/再開したいときは常にハンドラスレッドを中断することです。

+0

これはおそらく、答えではなく、コメントでなければなりません。 – bhspencer

+0

ループが実行されている間は不可能なユーザー入力をチェックせずに、whileループでハンドラースレッドを中断する方法について私の頭が浮かび上がったので、私はスレッドで私の運を試しました。どうもありがとう=) – JasonBr