tcp多线程服务器java

时间:2013-04-14 22:51:03

标签: java tcp

我尝试创建多线程服务器,它将接收来自不同客户端的消息,然后发回消息。我正在使用执行服务器来管理创建 线程。但我不确定我是否正在做它,我以前没有使用过执行服务?我有这条线的问题 executor.execute(new Handler(client));处理程序是抽象的,无法初始化?怎么解决?将绑定端口执行服务解决问题?它会像客户的请求队列一样smth吗? 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(){
         //............   

    }

}

1 个答案:

答案 0 :(得分: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);

在多线程服务器中,每次客户端连接时,服务器都会创建一个新线程,并且此线程适用于此客户端的工作。这就是为什么你要将这个线程定义为内部类并实现runnable接口。