1

さまざまなクライアントからメッセージを受信して​​からメッセージを返信するマルチスレッドサーバーを作成しようとしています。実行サーバーを使用してスレッドの作成を管理しています。しかし、私がそれを正しく行っているかどうかはわかりません。以前にエグゼキューターサービスを使用したことがありませんか? そして、このライン executor.execute(new Handler(client));ハンドラーが抽象的で、初期化できないという問題がありますか? 修正方法は?実行サービスはポートのバインドに関する問題を解決しますか? クライアントのリクエストのキューのようなものになりますか?thx事前に

package serverx;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Handler;


public class ServerX {

  public static void main(String [] args){

    ExecutorService executor = Executors.newFixedThreadPool(30);

    ServerSocket server;
    try{

        server= new ServerSocket(5555);
        System.out.println ("Server started!");

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

                //Thread t= new Thread (new Handler(client));
                //t.start();
                executor.execute(new Handler(client));    
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

    }catch (IOException el){
        el.printStackTrace();
    }

  }
}

ハンドラ:

public class Handler implements Runnable{

        private Socket client;

        public Handler(Socket client){
            this.client=client;}
        public void run(){
         //............   

    }

}
4

1 に答える 1

2

ハンドラーは抽象的であってはなりません。ハンドラー クラスを内側にし、while ループの外側でクライアント ソケットを定義します。

Socket client;
while(true) {
try{
client = server.accept();
executor.execute(new Handler(client));
}

あなたの質問についてさらに追加したいと思います。

ExecutorService は、スレッド数の制御に非常に優れています。また、「30」が要件でない場合は、そのようにスレッド数を定義できます。:

 int poolSize = 50 * Runtime.getRuntime().availableProcessors();
 ExecutorService tasks = Executors.newFixedThreadPool(poolSize);

マルチスレッド サーバーでは、クライアントが接続するたびに、サーバーが新しいスレッドを作成し、このスレッドがこのクライアントのジョブに対して機能します。そのため、このスレッドを内部クラスとして定義し、実行可能なインターフェイスを実装します。

于 2013-04-14T23:01:33.643 に答える