2016-10-21 4 views
0

1つのクライアントを引き続きリッスンし、2つのメッセージのいずれかを返信する必要があります。Java ServerSocket accept-method連続リッスン

accept-methodの仕組みがわかりません。私はそれがクライアントへの接続を開き、その接続を返していることを理解しています。

しかし、次のループではどうなりますか?クライアントからの次のメッセージが到着するまでブロックされますか? また、以下のコードはこの問題の良いアプローチですか?

ServerSocket ss = new ServerSocket(); 
while(true) { 
    Socket socket = serverSocket.accept(); 

    //Retreive message from client here 

    if(incomingFromClient.equals(something)) { 
     ReplyThread rt = new ReplyThread(socket, reply_1); 
     rt.start() 
    } else if(incomingFromClient.equals(somethingElse)) { 
     ReplyThread rt = new ReplyThread(socket, reply_2); 
     rt.start(); 
    } 
} 
+0

'while(true)'は、**実効的にデッドロックがあるので、**良い**アプローチです。実行時にループ本体をスキップすることができます。*このプログラムは決して停止しません。 ..アプリケーションのクラッシュの主な理由の1つ、ユーザーにプロセスを強制終了させる。ループヘッドで 'AtomicBoolean'を使うと、この問題は解決されます。そして、すべての力と自由時間でこのようなミスを守ろうとするプログラミングの初心者をすべて無視してください...初心者のミスは決して*"良いコード " *初心者の大半が欲しいからです。私の3.14セント。 – specializt

+0

"良い"アプリケーションの仕組み: 制御された起動/ init - >制御された実行時間 - >制御されたシャットダウン/解除。それを賢く惜しみなく使ってください。 – specializt

+0

AtomicBooleanソリューションをありがとう。 acceptメソッドは、クライアントからの次のメッセージが到着するまで待機しますか? –

答えて

0

いいえacceptループでクライアントとのI/Oを実行しないでください。そうしないと、不正なクライアントが世界を止めて、後続のクライアントがサービスを受けるのを防ぐことができます。各受け入れソケットに対して開始するスレッドは、そのソケットに対するすべての入出力を行う必要があります。

関連する問題