package com.example.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedTCPServer {

	private static final int PORT = 8080;

	public static void main(String[] args) {
		// start the server to listen on port 8080
		try (ServerSocket serverSocket = new ServerSocket(PORT)) {
			// create executor with pool size 10
			ExecutorService executor = Executors.newFixedThreadPool(10);
			System.out.println("Server is listening on port " + PORT);
			// server is listening for incoming connection...
			while (true) {
				Socket clientSocket = serverSocket.accept();
				executor.submit(new ClientHandler(clientSocket));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static class ClientHandler implements Runnable {
		private final Socket socket;

		public ClientHandler(Socket socket) {
			this.socket = socket;
		}

		@Override
		public void run() {
			try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
					BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
				String message = in.readLine();
				System.out.println("Received: " + message);
				out.println("Hello from server!");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}
