import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.net.InetSocketAddress;
import java.nio.channels.Channels;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.stream.IntStream;

public class Server {
  private static final int MAX_CONNECTION = 12;
  
  public static void listen(int port) throws IOException {    
    ServerSocketChannel serverChannel = ServerSocketChannel.open();
    serverChannel.bind(new InetSocketAddress(port));
    IntStream.range(0, MAX_CONNECTION).forEach(__ -> new Thread(
        () -> {
          for(;;) {
            try(SocketChannel channel = serverChannel.accept()) {
              try (
                  Reader socketReader = Channels.newReader(channel, "US-ASCII");
                  BufferedReader reader = new BufferedReader(socketReader);
                  Writer writer = Channels.newWriter(channel, "US-ASCII")) {
                String line;
                while((line = reader.readLine()) != null) {
                  String result = service(line);
                  writer.write(result);
                  writer.write('\n');
                  writer.flush();
                }
              } catch(IOException e) {
                System.err.println(e.getMessage());
              }
            } catch(IOException e) {
              System.err.println(e.getMessage());
              break;  // accept error, we are morons
            }
          }
        }).start());
  }
  
  public static String service(String line) {
    System.out.println("service " + line);
    return line;
  }
}
