2012-03-06 10 views
0

MessageServerクラスをセットアップして、別のリクエストで各クライアントにサービスを提供しようとしています(これはかなり直感的です)。Java - 各クライアントを別々のスレッドで処理するサーバー?

どうすればよいですか?

import java.net.*; 
import java.io.*; 

public class MessageServer { 

public static final int PORT = 6100; 

public static void main(String[] args) { 

    Socket client = null; 
    ServerSocket sock = null; 
    BufferedReader reader = null; 

    try { 
     sock = new ServerSocket(PORT); 
     // now listen for connections 
     while (true) { 
      client = sock.accept(); 

      reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 

      Message message = new MessageImpl(reader.readLine()); 

      // set the appropriate character counts 
      message.setCounts(); 

      // now serialize the object and write it to the socket 
      ObjectOutputStream soos = new ObjectOutputStream(client.getOutputStream()); 
      soos.writeObject(message); 
      System.out.println("wrote message to the socket"); 

      client.close(); 
     } 
    } 
    catch (IOException ioe) { 
      System.err.println(ioe); 
    } 


} 

}

+0

私は自分のオペレーティングシステムのテキストブックで検索していますが、読み込みに問題はありませんが、それほど多くはありません。/ –

+0

時間がかかる部分はありますか?あなたはテストしましたか?どんな負荷の下でどれくらいのスピードを得る必要がありますか?早期の最適化はすべての悪の根源です。これを実行する前に何をしようとしているのかを必ず確認してください。 (例えば、多くの場合、スレッディングが遅くなる可能性があります) –

答えて

1

申し訳ありませんが、あなたの質問にはあまり意味がありません。

通常の方法で「要求」という用語を使用している場合、クライアントはサーバーに要求を送信し、サーバーは各要求を処理します。サーバーが要求を別々に(ある意味で)サービスしないのは、単純に意味がありません。

おそらく、あなたは何か違うことを求めています。 (それぞれのクライアントのリクエストを別のスレッドで処理するという意味ですか?)何を意味していても、用語を確認してください。あなたがExecutorService APIを使用して、別のスレッドで要求を実行について話していることを考えると


は良い選択です。ワーカースレッドの数に上限を設定できる実装クラスを使用します。そうしないと、オーバーロードの結果、スレッドの数が多くなり、サーバーの速度が遅くなる問題が発生します。 (新しいスレッドを作成するのは安価ではありません。リサイクルしなければなりません)

また、は、要求キューを持たないようにexecutorを構成することを検討してください。使用可能なワーカーがない場合、エグゼキュータ・サービスがジョブをサブミットしようとしているスレッドをブロックするようにします。オペレーティングシステムが着信接続/要求をServerSocketレベルにキューさせます。要求を内部的にキューに入れると、クライアント側がすでにタイムアウト/放棄した要求を処理して時間を無駄にしている状況に陥ることがあります。

+0

これは私が「はい」を意味するものです。私はたぶんExecutorインターフェースを使用するのでしょうか? –

+0

私はJavaでオペレーティングシステムの概念を熟読しています、第8版..それはありませんか? –

+0

それはうまくいくでしょう。実際には、単純な「各リクエストに新しいスレッドを作成する」アプローチよりも優れています。ワーカースレッドの数に制限を設けることを可能にするエグゼキュータの実装を使用します。 –

関連する問題