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();
}
}
}