home / connvers / src / main / java / avividi / connvers / server / Server.java

Server.java



package avividi.connvers.server;

import avividi.connvers.UserInputHandler;
import avividi.connvers.protocol.Message;
import avividi.connvers.protocol.MessageEncoder;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static avividi.connvers.Connvers.printSystemLine;

public class Server {

  private final String user;
  private final int port;
  private final MessageEncoder messageEncoder;

  public Server(String user, int port, MessageEncoder messageEncoder) {
    this.user = user;
    this.port = port;
    this.messageEncoder = messageEncoder;
  }

  public void start() throws IOException {
    ServerSocket serverSocket = new ServerSocket(port);

    try (Storage storage = new Storage(messageEncoder, new File("storage.txt"))) {
      ConnectionPool connectionPool = new ConnectionPool(user, storage);
      ExecutorService threadPool = Executors.newCachedThreadPool();
      threadPool.submit(new UserInputHandler(
          user,
          false,
          connectionPool,
          new ServerSideCommander(connectionPool))
      );

      printSystemLine("Started up successfully.");
      storage.getMessages().forEach(Message::print);
      printSystemLine(String.format("User <%s> joined.", user));

      while (!Thread.currentThread().isInterrupted()) {
        // wait for a client to connect
        try {
          Socket clientSocket = serverSocket.accept();

          // create a new client handler object for that socket,
          // and fork it in a background thread
          ClientConnectionHandler connectionHandler = new ClientConnectionHandler(clientSocket, connectionPool, messageEncoder);
          threadPool.submit(connectionHandler);
        }
        catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
      threadPool.shutdown();

    }
  }
}