@Override
	public void run() {
		initializeLogger();
		this.log.info("Start chat server");
		this.currentThread = Thread.currentThread();
		if (this.currentThread.isInterrupted()) {
			this.log.info("current Thread is Interrupted");
			this.log.severe("finish -1");
			return;
		}
		ServerSocket serverSocket = createServerSocket();
		if (serverSocket == null){
			this.log.severe("finish -2");
			return;
		}
		
		while (true) {
			if (isCurrentThreadInterrupted(serverSocket))
			{
				this.log.info("finish -3");
				return;
			}
			if (this.clients.size() >= this.serverInfo.getMaxClients())
			{
				this.log.info("server is busy");
				continue;
			}
			Socket clientSocket = null;
			try {
				this.log.info("server Socket WAIT client Socket");
				clientSocket = serverSocket.accept();
				this.log.info("server Socket ACCEPT client Socket: " + clientSocket.toString());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				clientSocket = null;
				this.log.severe("server Socket ACCEPT client Socket: fail");
			}
			if (clientSocket == null)
			{
				this.log.info("clientSocket == null --> continue");
				continue;
			}
			
			int threadId = getFreeThreadId();
			if (threadId < 0) continue;
			ClientHandler clientHandler = new ClientHandler(clientSocket, this, threadId, this.verbose);
			this.log.info("CREATE client Handler: " + clientHandler.toString());
			this.clientHandlerThread[threadId] = new Thread(clientHandler);
			this.log.info("CREATE Thread[" + threadId + "] for client Handler");
			clientHandlerThread[threadId].start();
			this.log.info("START Thread[" + threadId + "] for client Handler");
		}
	}