ソケット+スレッドプール(ExecutorService)


サービス:

public class MultiServerPool {
	private ServerSocket serverSocket;
	private ExecutorService pool;//  
	private final int POOL_SIZE = 10;//  CPU 

	public void service() {
		try {
			serverSocket = new ServerSocket(2046);
			// Runtime availableProcessor() CPU .
			pool = Executors.newFixedThreadPool(Runtime.getRuntime().
availableProcessors() * POOL_SIZE);
			System.out.println(" ...");

			while (true) {
				Socket socket = serverSocket.accept();

				pool.execute(new Handler(socket));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new MultiServerPool().service();
	}

}

class Handler implements Runnable {

	private Socket socket;
	private BufferedReader is;
	private PrintWriter os;

	public Handler(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			os = new PrintWriter(socket.getOutputStream());

			String msg = is.readLine();

			if (msg.equals("1")) {
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			System.out.println(" :" + msg);
			os.println(" :" + msg);
			os.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (os != null) {
					os.close();
				}
				if (is != null) {
					is.close();
				}
				if (socket != null) {
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

クライアント:

public class MultiClient {

	private static Runnable service(final int i) {
		return new Runnable() {
			private Socket socket = null;
			BufferedReader in = null;
			PrintWriter out = null;

			@Override
			public void run() {
				try {
					socket = new Socket("localhost", 2046);

					in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					out = new PrintWriter(socket.getOutputStream());

					out.println(i);
					out.flush();
					System.out.println(in.readLine());

				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		};
	}

	public static void main(String[] args) {
		Thread t1 = new Thread(service(1));
		Thread t2 = new Thread(service(2));
		t1.start();
		t2.start();
	}
}