package ilarkesto.net; import ilarkesto.concurrent.ATask; import ilarkesto.concurrent.TaskManager; import ilarkesto.core.logging.Log; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; public class ServerSocketTask extends ATask { private static final Log LOG = Log.get(ServerSocketTask.class); private ClientHandler clientHandler; private int port; private ServerSocket serverSocket; private TaskManager clientHandlerTaskManager; public ServerSocketTask(ClientHandler clientHandler, int port, TaskManager clientHandlerTaskManager) { this.clientHandler = clientHandler; this.port = port; this.clientHandlerTaskManager = clientHandlerTaskManager; } @Override protected void perform() { try { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(1000); } catch (IOException ex) { throw new RuntimeException(ex); } while (!isAbortRequested()) { Socket clientSocket; try { clientSocket = serverSocket.accept(); LOG.debug("Client connected:", clientSocket.getInetAddress().getHostAddress() + ":" + clientSocket.getPort()); } catch (SocketTimeoutException ex) { // nop continue; } catch (IOException ex) { clientHandler.onIOException(ex); continue; } ClientHandlerTask clientHandlerTask = new ClientHandlerTask(clientSocket); clientHandlerTaskManager.start(clientHandlerTask); } } @Override public String toString() { return "ServerSocket:" + port; } class ClientHandlerTask extends ATask { private Socket clientSocket; public ClientHandlerTask(Socket clientSocket) { this.clientSocket = clientSocket; } @Override protected void perform() { clientHandler.handleClient(clientSocket); } } }