socket programming geeks for java multithreading serversocket

programming - java socket connection



¿Creando el ServerSocket en un hilo separado? (1)

Por lo general, uso N + 1 hilos para esto: uno para ServerSocket, para evitar bloquear toda la aplicación esperando que un cliente se conecte; y N subprocesos para procesar las solicitudes del cliente, siendo N el tamaño del grupo de subprocesos (recomiendo usar un grupo de subprocesos para crear un nuevo subproceso por cliente).

Aquí hay un ejemplo (simplemente codificado, es posible que desee tener una mejor administración de excepciones, pero este es un ejemplo mínimo de trabajo)

public class Server { public static void main(String[] args) { new Server().startServer(); } public void startServer() { final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10); Runnable serverTask = new Runnable() { @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(8000); System.out.println("Waiting for clients to connect..."); while (true) { Socket clientSocket = serverSocket.accept(); clientProcessingPool.submit(new ClientTask(clientSocket)); } } catch (IOException e) { System.err.println("Unable to process client request"); e.printStackTrace(); } } }; Thread serverThread = new Thread(serverTask); serverThread.start(); } private class ClientTask implements Runnable { private final Socket clientSocket; private ClientTask(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { System.out.println("Got a client !"); // Do whatever required to process the client''s request try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

Tengo un problema con el uso de un ServerSocket en mi aplicación.

Estoy creando el ServerSocket en el constructor de mi aplicación. El constructor del socket llama al método accept() para esperar a que un cliente se conecte.

El problema es que el método accept() está congelando toda mi aplicación hasta que un cliente se conecta. Entonces, me gustaría preguntar si hay una alternativa a la creación de todo ServerSocket en un subproceso separado, ¿que el constructor de ServerSocket y su método accept() se llaman junto a mi aplicación principal?

Editar:

Gracias a Olivier por el consejo, poner el .accept en un ejecutable y crear un grupo de subprocesos para manejar las conexiones de clientes.

Ese es mi código en este momento:

public void start(){ final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10); Runnable serverTask = new Runnable() { @Override public void run() { try { serverSocket = new ServerSocket(port); while (true) { Socket clientSocket = serverSocket.accept(); objectout = new ObjectOutputStream(clientSocket.getOutputStream()); clientProcessingPool.submit(new ClientTask(clientSocket,objectout)); } } catch (IOException e) { System.err.println("Accept failed."); } } };

¡Todo funciona bien! ¡Gracias!