1. ClientGUI: Thread aus GUI genommen, gehört da eigentlich gar nicht rein.
2. DefaultChatClient:
 2.1 run() auf Endlosschleife umgebaut
 2.2 verbinden() startet jetzt den Thread
3. ConnectionHandler: run() fügt CH in TeilnehmerListe ein - nur so ne Idee...
4. DefaultChatServer: run() fügt keinen CH mehr in die TeilnehmerListe ein
+ Des Rätsels von heute Mittag Lösung: TeilnehmerListe war die ganze Zeit null, weil sie erst in TeilnehmerListe.addTeilnehmer() gesetzt wurde... -.- Hab sie jetzt mit in den Konstruktor gepackt, da haben wir sogar gleich eine tolle Klasseninvariante mehr!
+ Vorschlag für Klasseninvariante der TeilnehmerListe: Alle Teilnehmer haben gültige Namen und sie hat immer einen gültigen Server

1. DefaultChatClient:
 1.1 run(): "case CONNECT:" entfernt, der komplette Kram zum Verbindungsaufbau passiert jetzt in verbinden()
2. ConnectionHandler:
 2.1 Konstruktor um TeilnehmerListe erweitert
 2.2 Handshake (connect:NAME? - connect:ok, kannst rein!) eingebaut
3. ServerGUI: Server wird zuerst gestartet, danach der Thread
4. TeilnehmerListe:
 4.1 Server-Objekt wird jetzt im Konstruktor übergeben --> Klasseninvariante und ermöglicht Output über Server
 4.2 addTeilnehmer() gibt jetzt boolean zurück, um dem ConnectionHandler mitzuteilen, ob er aufgenommen wurde
 4.3 addTeilnehmer() schickt jetzt connect:ok an den Client (vorher hat das der CH selbst gemacht)
1. DefaultChatClient:
 1.1 Der Thread wird jetzt tatsächlich gestartet!
 1.2 Debug-Ausgabe der null-Inputs entfernt
2. Nachricht: Namelist-Nachrichten sind jetzt nicht mehr null
3. ConnectionHandler: break nach erfolgreichem Handshake
4. TeilnehmerListe: addTeilnehmer() und removeTeilnehmer() feuern beide fireContentsChanged(this, 0 getSize())
1. ClientGUI: Client-Thread entfernt
2. ConnectionHandler: continue nach erfolgreichem Handshake
1. ChatClient: beenden() entfernt - trennen() übernimmt die Aufgaben
2. ClientGUI: Fenster schließen benutzt jetzt trennen() statt beenden
3. DefaultChatClient:
 3.1 aktiv und verbunden entfernt, fallen mit beenden() weg
 3.2 disconnect: und refused: rufen trennen() auf
 3.3 trennen() setzt die Teilnehmerliste des Clients auf ein leeres String-Array (Workaround!)
 3.4 istVerbunden() richtet sich jetzt nach dem Verbindungsstatus des Sockets
4. Nachricht: disconnect:shutdown als gültige Nachricht aufgenommen
5. ConnectionHandler:
 5.1 run(): Von while(!interrupted) auf Endlosschleife umgestiegen, die über Exceptions beendet wird
 5.2 close() schließt jetzt eiskalt den Socket und der Thread erledigt den Rest.
6. DefaultChatServer: printNachricht() in printText() umbenannt, weil keine Nachrichten-Objekte ausgegeben werden (Last-Minute-Änderung, um Verwirrung zu vermeiden, ha ha :D)
7. TeilnehmerListe:
 7.1 addTeilnehmer(): Rückmeldung an Server-GUI über server.printText() bei neuen Teilnehmern - Rückmeldung an Client über refused:x steht immer noch aus!
 7.2 removeTeilnehmer() entworren und mit Rückmeldung an GUI versehen
 7.3 removeAllTeilnehmer(): verwendet nicht mehr removeTeilnehmer() wegen Mehrfachbenachrichtigung/Thread-Problemen und feuert nur noch ein Event mit der Kompletten Liste
1. ChatClient: JavaDoc für istVerbunden() eingefügt und Kommentar entfernt
2. ClientGUI: appendText() macht das Eingabefeld wieder frei und scrollt das Nachrichtenfeld nach unten
3. DefaultChatClient:
 3.1 interrupted ist wieder im Rennen, weil trennen() sonst jedes mal disconnect: verschicken würde
 3.2 Bei disconnect:* und refused:* wird jetzt interrupted statt trennen() verwendet
4. ConnectionHandler:
 4.1 Gerümpel entfernt: ip, port, interrupted + einige Kommentare
 4.2 run(): Der Handshake arbeitet jetzt mit den Exceptions aus Teilnehmer.addTeilnehmer() - geil, oder? :D
 4.3 run(): switch-Block verbessert
5. TeilnehmerListe:
 5.1 addTeilnehmer(): Exceptions wieder eingebaut und Texte verbessert
 5.2 removeAllTeilnehmer(): feuert nur noch ein Event statt n...
Merge branch 'threads'

Conflicts:
	src/client/ClientGUI.java
	src/server/ConnectionHandler.java
	src/server/DefaultChatServer.java