# Hilfe bei Chatprogramm



## eQui (15. Aug 2007)

hallo,

erstmal: das ist mein erstes programm das im netzwerk agiert also bitte keine all zu komplizierten sachen antworten.
es gibt einen input- und einen outputstream. chatten an sich funktioniert, allerdings würd' ich noch gerne eine liste realisieren, in der man sieht wer gerade online ist. ich dachte an ein string-array, dass der server dann immer an alle clienten mitschickt. allerdings weiß ich nicht wie ich das konkret verschicken soll und wie der client es von einer herkömmlichen chatnachricht unterscheiden kann.

ein paar ideen wären sehr interessant, falls jemand nähere informationen zum programm benötigt:
ich habe dieses tutorial verwendet , inzwischen aber schon einige sachen abgeändert.

LINK

gruß, equi


----------



## anfänger15 (16. Aug 2007)

hier mal ein Link aus den FAQ

Da findest du ein Chatprogramm bei dem sowas möglich ist

www.java-forum.org/de/viewtopic.php?t=6033

(einfach ein bischen runterscollen).


----------



## Brunnenfrosch (19. Aug 2007)

ich mache es folgendermaßen:
bei mir werden die nachrichten in einer ganz bestimmten syntax versandt:
wenn sich ein socket anmeldet, verschickt er unter anderem die nachricht "nick:#:EigenerName" im entsprechenden server-socket-thread, wird das wie folgt behandelt:

...

```
String[] hilf;

try{
    hilf=eingang.split(":#:");
}catch(PatternSyntaxException e){}
if(hilf[0].equals("nick")){
    verteiler("userplus:#:"+hilf[1]);
}
```


im socket der clients wird das wie folgt analysiert:


```
String[] hilf;

try{
    hilf=eingang.split(":#:");
}catch(PatternSyntaxException e){}
if(hilf[0].equals("userplus")){
    userPanel.addUser(hilf[1]);
}
```

der client könnte zum beispiel den string "userliste:#:eigenername" versenden und der der serversocket prüft, wenn er die usernamen in einer hashtabelle namens USER gespeichert hat

```
if(hilf[0].equals("userliste")){
    String str="userliste:#:";
    try{
        for(Enumeration e = clients.keys();e.hasMoreElements();){
	str=str.concat((String)e.nextElement());
        }
    }
    catch(Exception e){}
    senden("eigenername",str);
}
```
und der client analysiert:


```
if(hilf[0].equals("userliste")){
    try{
        for(int i=1;i<Array.getLength(hilf);++i){
	userPanel.addUser(hilf[i]);
        }
    }
    catch(IllegalArgumentException e){}
  
}
```


normale nachrichten haben bei mir die form:

txt:#:EigenerName:#:adressat:#:nachricht
der server prüft in derselben "dekodier-methode"

```
if(hilf[0].equals("txt")){
    if(hilf[2].equals("all")){
        verteiler(hilf[1]+ "sagt: "+hilf[3]);
    }
    else{
        if(isClient(hilf[2])){
            senden(hilf[2], hilf[1]+" flüstert: "+hilf[3]);
        }
    }
}
```

_[Edit by Beni: Codetags!]_ Danke Beni - ich wußte nicht, wie das mit den code-tags geht


----------



## Dante (19. Aug 2007)

hi, 

das sieht garnicht so schlecht aus, ein paar anmerkungen aber noch:

- vertraue keinen usereingaben. Hier muss jede Zeile die vom Client kommt als Eingabe betrachtet werden, da garnicht klar ist, welcher Client benutzt wird., Und da sich Clients NICHT immer so verhalten müssen wie wir das gerne hätten, müssen Eingabven immer überprüft werden.

- Du solltest also eine richtige Grammatik für dein protokoll festlegen. Sprich welche Nachrichten gibt es. Welche Felder haben diese Nachrichten. Welche Zeichen dürfen die Felder enthalten.

- Du brauchst nur ein Trennzeichen, nicht drei. Doppelpunkt reicht aus.

- Überprüfe am besten ob eine Nachricht *genau* die Anzahl an Feldern hat, die du erwartest. So stellst du auch sicher, dass da keine Trennzeichen im Benutzernamen oder so verwendet werden.

- Soll allgemeiner Text übertragen werden, also etwas wo das Trennzeichen drin vorkommen darf, lege das Feld ans Ende der Nachricht und parse die Nachricht mit dem Wissen, dass dies das letzte Feld ist und in diesem Feld keine Trennzeichen beachtet werden.

Das ist in etwa die Vorgehensweise, welche das IRC-Protokoll benutzt und das funktioniert ja ganz gut


----------

