# Erstellen eines ChatServers



## slejden (13. Dez 2015)

Hallo,

ich soll  / will ein simples Chatprogramm erstellen. Die Vorgabe bestimmt 4 Dateien. ICHatServer, ChatRoom, MyChat. Realisiert werden können soll das man sich Eingeloggt, Ausgeloggt und man was schreiben kann.

Mein Problem ist ich habe kein Ansatz wie man dort voran geht. Habe mir das Buch geholt "Aufbaukurs Java", doch leider soll der Chat so nicht sein. 
Nun weiß ich nicht weiter und hoffe jemand von euch kann mir helfen.


----------



## Joose (13. Dez 2015)

Wo genau liegt das Problem? (eine konkrete Beschreibung mit Frage wenn möglich). Warum diese Vorgabe? Woher kommen diese Vorgaben?


----------



## slejden (14. Dez 2015)

ehm, soll ich Studium ein Chatprogramm, mit den Vorgaben meines Profs., erstellen. Möglichkeiten wurden stark eingeengt, weswegen wohl der Chat fast fertig ist. Habe trotzdem Probleme der Sache zu Folgen. Nun hatte ich mir aus diesem Grund mehrere Bücher besorgt und auch kräftig gegooglt. Auffällig ist die immer wiederkehrende Syntax, die ich leider nicht nutzen kann. Um besser zu verstehen was mir fehlt habe ich das unfertige Programm hochgeladen. Der IChatServer brauch wohl noch ausformulierte Funktionen.
Soweit so gut...


----------



## Joose (14. Dez 2015)

Gut du hast eine Vorlage vom Prof, diese hast du schon gezeigt (Hinweis: Code bitte in Code-Tags posten -> [code=java]/* dein java code */[/code]).
Deine genaue Aufgabe hast du nur angerissen, am besten gibst du diese Wort für Wort wieder (hier kann man auch ein Bild davon machen).

Und dann noch eine konkrete Frage wo dein Problem ist 

IChatServer darf keine ausformulierten Methoden enthalten, da es sich hierbei um ein Interface handelt (Grundlagen OOP).


----------



## slejden (14. Dez 2015)

```
public interface IChatServer
{
    /**
    * Informiert den Chatserver dass der user seinen aktuellen Raum verlassen will
    * Der User muss natuerlich eingeloggt sein
    * @param user der den Raum verlaesst
    * @return liefert die liste aller uebrigen user des raums.
    * liefert null wenn der user nicht in einem raum war
    */
    private raumBetreten;
    private raumVerlassen;
    public server;
    public User;
     
    public List<User> leaveRoomRequest(User user);

    /**
    * ein eingeloggter user betritt einen neuen raum. wenn er bereits in einem raum ist wird er dort abgemeldet
    * @param user name der den raum betritt
    getUsersForRoomRequest
    * @param roomName name des neuen raums
    roomName
    * @return liefert eine userliste aller user die jetzt im raum sind
    return users.add(all)
    */
    public List<User> enterRoomRequest(User user, String roomName);

    /**
    * fragt den server nach einer namesliste aller chatraeume
    * @return liste aller raumnamen
    */
    public List<String> getChatRoomsRequest();

    /**
    * liefert die namen aller user die im gleichen raum wie der user sind
    * der user muss angemeldet sein und in einem raum, sonst gibt es ein null ergebnis
    * @param user the user
    * @return liste aller usernamen oder null
    */
    public List<User> getUsersForRoomRequest(User user);

    /**
    * meldet den user am chatserver an. der user ist dann noch in keinem raum
    * @param user name der sich anmeldet
    * @return liste aller chatroom-namen
    * @throws Exception wenn bereits ein user mit gleichem namen angemeldet ist
    */
    public List<String> userLogin(String username, String password)
            throws Exception;

    /**
    * user wird aus dem server abgemeldet. wenn er der letzte user im server war, wird dieser beendet.
    * der user muss eingeloggt sein, sonst passiert nichts
    * @param name des user der sich abmeldet.
    */
    public void userLogout(User user);
}
```

Zu dieser Datei sind noch 3 weitere gegeben. Doch müssen in dieser die Kommentare ausformuliert werden. So z.B. unter "interface IChatServer", es soll angezeigt werden das jemand den Raum betritt oder verlässt.
Kann mir denken das dazu in der Datei "Room.java" geguckt werden muss, wie die Aussage betreten bzw leave definiert ist. Daher hab ich die 4 defintionen einfach mal reingepackt:
private raumBetreten;
private raumVerlassen;
public server;
public User;
habe diesen Stil des öfteren gesehen. Nur der Grund ist mir nicht geläufig. Ja wie gehe ich nun weiter vor?
Abarbeiten der Kommentare. So z.B. User muss eingeloggt sein! Könnte sich auf ein this, oder add- Fkt beziehen?!
Pff ja weiß gar nicht wo/wie ich anfangen soll.


----------



## Joose (14. Dez 2015)

slejden hat gesagt.:


> Doch müssen in dieser die Kommentare ausformuliert werden. So z.B. unter "interface IChatServer", .......
> Kann mir denken das dazu in der Datei "Room.java" geguckt werden muss,



Oben gibt es keine "Room.java" sondern nur txt Dateien ....
Außerdem steht ein Kommentar zu einer Methode immer über der Methode nicht darunter 



slejden hat gesagt.:


> es soll angezeigt werden das jemand den Raum betritt oder verlässt. Kann mir denken das dazu in der Datei "Room.java" geguckt werden muss, wie die Aussage betreten bzw leave definiert ist. Daher hab ich die 4 defintionen einfach mal reingepackt:
> private raumBetreten;
> private raumVerlassen;
> public server;
> public User;



Was soll das genau sein? Da fehlt bei jedem dieser 4 "Dinger" eine Typangabe.
Außerdem kann ein Interface nur Methodensignaturen und Konstanten enthalten und keine Attribute oder dergleichen.
Diese Dinge gehören dann in die Klasse, welche das Interface implementiert.



slejden hat gesagt.:


> habe diesen Stil des öfteren gesehen. Nur der Grund ist mir nicht geläufig.



Welchen Stil?



slejden hat gesagt.:


> Ja wie gehe ich nun weiter vor?
> Abarbeiten der Kommentare. So z.B. User muss eingeloggt sein! Könnte sich auf ein this, oder add- Fkt beziehen?!
> Pff ja weiß gar nicht wo/wie ich anfangen soll.



Die im 1.Post hinzugefügte Datei "MyChat.txt" enthält doch schon eine Java Klasse, welche das Interface "IChatServer" implementiert und die Methoden zu einen großen Teil schon geschrieben hat.
Dort müsstest du nur ansetzen und eben noch das ergänzen was noch fehlt.
Gehe von Methode zu Methode vor ... überlege dir was laut Kommentar verlangt ist das die Methode können soll und versuche es umzusetzen.

Solltest du dann eine konkrete Frage haben bzw. wo hängen kannst du hier auch eine konkrete Frage stellen


----------



## slejden (14. Dez 2015)

wenn ich das jetzt richtig verstehe, ist soweit alles fertig um in MyChat alles auszuführen? 
Gehe davon aus das in IChatServer noch ein paar Sachen eingetragen werden müssen?!


----------



## Joose (14. Dez 2015)

slejden hat gesagt.:


> wenn ich das jetzt richtig verstehe, ist soweit alles fertig um in MyChat alles auszuführen?



Das habe ich nie behauptet. Ich habe nur gesagt das in der Klasse "MyChat" das Interface implementiert wird und schon große Teile der Kommentare abgedeckt werden.
Deine Aufgabe wäre es eben nun zu kontrollieren ob deiner Meinung nach die Methoden in "MyChat" alle so implementiert sind wie es das Kommentar im Interface verlangt!

Außerdem wirst du dir schwer tun "MyChat" auszuführen 
Deine main Methode ist in TestChat.java. Dort musst du dann eben eine Instanz von MyChat erstellen.



slejden hat gesagt.:


> Gehe davon aus das in IChatServer noch ein paar Sachen eingetragen werden müssen?!



Was willst du in "IChatServer" eintragen?
Wie oben schon gesagt das ist ein Interface und im Interface stehen nur Methodensignaturen (deren Kommentare) und Konstenten (sofern vorhanden).


----------



## slejden (14. Dez 2015)

Frage zu private String user/secret


```
public class User                                            // Klasse mit Namen "User"
{
   
    private String user;
    private String secret;
   

    public User(String name, String passwort)                // Konstruktor 
    {
        this.user = name;
        this.secret = passwort;
    }
   
    public String getName()                                    // Buchstabenkette aus "Name" nehmen
    {
        return this.user;                                    // diesen Namen zurück geben
    }
   
    public boolean passwortKorrekt(String passwort)            // hier wird das Passwort geprüft   Parameter ist Passwort
    {
        return this.secret.equals(passwort);
    }
}
```

In dieser Klasse mit dem Namen "User" sind 
private String user;
private String secret;

definiert. 
Meine Frage: warum werden diese beiden privates hier defniert, wofür stehen diese?


----------



## InfectedBytes (14. Dez 2015)

```
this.user= name;
       this.secret= passwort;
```
eben username und passwort. 
Und jeder Benutzer muss eben einen Namen, sowie ein Passwort besitzen


----------



## Joose (14. Dez 2015)

Das sind Attribute der Klasse User. Sie beschreiben die Daten/Eigenschaften eines User Objekts.
Im Attribut "user" wird der Username gespeichert und im Attribut "secret" dürfte das Passwort gespeichert werden.


----------



## slejden (14. Dez 2015)

Die Datei IChatServer wird definiert mit "public interface IChatServer"

Hier ein *kurzer Ausschnitt*:

```
public interface IChatServer
{

    /**
    * Informiert den Chatserver dass der user seinen aktuellen Raum verlassen will
    * Der User muss natuerlich eingeloggt sein 
    * @param user der den Raum verlaesst
    * @return liefert die liste aller uebrigen user des raums. 
    * liefert null wenn der user nicht in einem raum war 
    */

    public List<User> leaveRoomRequest(User user);
...
...
...
/
```

In dieser werden keine Funktionen definiert sondern Methodensignaturen und Konstanten deklariert. 
Was sagt mir nun im Ganzen das Interface aus?
Stellt alle benötigten Klassen da?!


----------



## Joose (14. Dez 2015)

Ein Interface stell gar keine ("benötigte") Klasse dar. Ein Interface ist ein Interface.

Implementiert eine Klasse ein Interface, so muss diese Klasse alle im Interface definierten Methoden implementieren!


----------



## slejden (14. Dez 2015)

Dann könnte man sagen ein Interface bestimmt und in der Klasse die ein Interface implementiert *wird* alles im Interface definierte übernommen, bzw. muss übernommen werden von der Klasse?


----------



## javampir (14. Dez 2015)

was meinst du mit 


slejden hat gesagt.:


> ein Interface bestimmt



eine klasse, die ein interface implementiert, ist dazu verpflichtet, alle methoden des interfaces zu "implementieren", also einen methodenrumpf dazuzuschreiben. dies passiert natürlich in der jeweiligen klasse.


----------



## Joose (14. Dez 2015)

Hier hast du einen Link zu einer Seite wo Schnittstellen genauer erklärt werden (sowie andere Grundlagen der OOP):
http://www.java-tutorial.org/interfaces.html


----------



## slejden (23. Dez 2015)

Wie kann ich festhalten das sich jemand ausloggt?

Meine Überlegung hat mit .remove zu tun, würde das passen?
z.B.: user.remove(name);


----------



## Joose (25. Dez 2015)

Im 1.Post in der Klasse MyChat.java hast du diesen Punkt doch schon gelöst oder?


----------



## slejden (25. Dez 2015)

eine Gegenfrage, gibt es hier eine Abteilung mit Übungsaufgaben- dürfen durchaus simple sein?

Ja stimmt schon ist in MyChat.


```
for (int i = 0; i < allRooms.size(); i++)
        {
(3)            ChatRoom currentroom = allRooms.get(i);       // <<-------- zum Beispiel an dieser Stelle
            if (currentroom.getAllUsers().contains(user))
            {
                currentroom.delUser(user);
                return currentroom.getAllUsers();
            }
        }
```

In Zeile 3 kommt der Befehl currentRoom vor. Ist dies ein expliziter Java-befehl, oder setzt sich einer Deklaration zusammen?[/code]


----------



## Joose (25. Dez 2015)

currentRoom ist die Bezeichnung der lokalen Variable (vom Typ ChatRoom). Du könntest statt currentRoom dir auch eine andere Bezeichnung ausdenken wie "hugo", "fritz" oder "superduperrollercoaster1". Aber man sollte normalerweise eine Bezeichnung benennen die gleichzeitig erklärt welches Objekt man durch diese Variable anspricht. In diesem Fall den aktuellen Raum (currentRoom) da man in der Schleife anscheinend alle Räume der Liste (allRooms) durchgeht.

Bitte beschäftigte dich nochmals mit den Grundlagen, diese fehlen dir anscheinend!


----------

