private void authentification() throws IOException 
    {
        Command cmd = this._in.readCommand();
        
        char op = cmd.getOperator();
        CommandArgsIterator args_it = (CommandArgsIterator) cmd.iterator();
        if (op == 'C' && args_it.hasNext()) {
            // Vérifie atomiquement si le nom d'utilisateur est déjà enregistré.
            String user_name = args_it.next();
            if (!args_it.hasNext()) {
                boolean existing;
                Map<String, Client> users = this._server.getUsers();
                synchronized (users) {
                    if (users.containsKey(user_name))
                        existing = true;
                    else {
                        existing = false;
                        users.put(user_name, this);
                    }             
                }

                if (existing) {
                    this.writeCommand(Errors.AlreadyUsedUsername);
                    this.authentification();     
                } else {
                    // Authentification réussie. Change l'état du client.
                    this.traceEvent(
                        "Client authentifié en tant que " + user_name
                    );
                    try {
                        this.ack();
                        this.mainLoop(user_name);
                    } finally { 
                        this.disconnect(user_name);
                    }
                }
            } else {
                this.syntaxError();
                this.authentification();
            }
        } else if (op != 'D') {
            this.syntaxError();
            this.authentification();
        }
    }