编写Java服务器以并发(同时)处理多个客户端

编写Java服务器以并发(同时)处理多个客户端,java,multithreading,client-server,Java,Multithreading,Client Server,我正在开发一个程序,其中有一个服务器和客户机类,但目前它一次只处理一个客户机。 我需要服务器能够使用多线程同时处理多个客户端 这是我的服务器代码;如何将其更改为同时处理多个客户端 public static void main(String[] args) throws IOException { ServerSocket socket = new ServerSocket(8945); Server serverInstance = new Server();

我正在开发一个程序,其中有一个服务器和客户机类,但目前它一次只处理一个客户机。 我需要服务器能够使用多线程同时处理多个客户端

这是我的服务器代码;如何将其更改为同时处理多个客户端

public static void main(String[] args) throws IOException {

       ServerSocket socket = new ServerSocket(8945);
       Server serverInstance = new Server();

       System.out.println("Server is running. Waiting for client.");

       while(true) {
           server.socket = s.accept();
           System.out.println("Client connected");
           serverInstance.run();
           System.out.println("Client disconnected. Waiting for new client.");
       }
   }

   public void run() {
       try {
           try {
               in = new Scanner(socket.getInputStream());
               out = new PrintWriter(socket.getOutputStream());
               RequestHandlingMethod();  

           } finally {
               socket.close();
           }

       } catch (IOException e) {
           System.err.println(e);
       }

}

创建一个单独的类来处理客户端。让它实现为可运行,这样您就可以用它启动一个单独的线程

然后在服务器中执行以下操作:

       System.out.println("Waiting for new client connection");
       Socket clientSocket = s.accept();
       System.out.println("Client connected");
       new Thread(new ClientHandler(clientSocket)).start();

如果您不想创建大量的可丢弃线程,那么您可能需要考虑使用缓存线程池的ExtutoService或您愿意选择的另一个线程池。 您只需使用ExecutorService executor=ExecutorService.newCachedThreadPool创建一个新的ExecutorService,然后在循环中执行以下操作:

       System.out.println("Waiting for new client connection");
       Socket clientSocket = s.accept();
       System.out.println("Client connected");
       executor.submit(new ClientHandler(clientSocket));
如果您认为您将拥有大量并发客户机,那么您可能需要考虑将非阻塞服务器与NIO结合使用。它将有一个单事件循环线程,而不是在accept上阻塞并处理其中的所有I/O事件,并且您可以有一个执行客户端处理逻辑的工作线程池

       System.out.println("Waiting for new client connection");
       Socket clientSocket = s.accept();
       System.out.println("Client connected");
       executor.submit(new ClientHandler(clientSocket));