# Chat selbst bauen



## Prengepower (18. November 2009)

Hallo!

Ich würde gerne einen Chat in Java bauen. Hab mich schon doll auf google usw. umgesehen aber bin leider nicht so wirklich schlau draus geworden.

Das ganze soll folgendermaßen aufgebaut sein:
Im Programm gibt es die Schaltfläche "hosten" und "verbinden". Wenn der User Hosten betätigt wird ein server im programm gestartet. Die anderen Clients können sich dann nach Eingabe von IP und Port zu dem Server verbinden (Schaltfläche "verbinden")... Im Programm habe ich dann einen Tree wo alle angemeldeten User angezeigt werden. Die Nachrichten sollen dann immer von einem User an alle verschickt werden. Also es findet keine "geschlossene" Kommunikation unter einzelnen Usern statt...

Könntet ihr mir bitte helfen wie ich das umsetzen kann... Weiß nicht so wirklich wie.. Hatte jetzt soweit gedacht, dass der Server beim Hosten in einem Thread gestartet wird. Das habe ich auch hinbekommen, allerdings weiß ich jetzt nicht genau wie ich das mit dem Tree und dem Nachrichtenaustausch anstellen soll...

Hatte das jetzt als klasse server angedacht:

```
package de.hwrberlin.jemm.net;

import java.net.*;
import java.util.Vector;
import java.io.*;

public class server implements Runnable {
	static final String  ANMELDUNG ="ANMELDUNG";
	static final String  ENDE      ="ENDE";
	static int port    = 1234;
	static int length  = 256; 

    public void run() {
    	DatagramPacket paket = new DatagramPacket( new byte[length], length);
    	Vector clients = new Vector();

        try {
   	        DatagramSocket socket = new DatagramSocket(port);
   	        for( ;; ) {
   	        	   socket.receive( paket );
    	           InetSocketAddress add = (InetSocketAddress)paket.getSocketAddress();

    	           String text = new String(paket.getData(), 0, paket.getLength());
    	           System.out.println( add +">" + text);

    	           if( text.equals( ANMELDUNG ) ) {
    	              clients.add( add );
    	              System.out.println( "Anzahl Clients: " + clients.size() );
    	           }  else if( text.equals( ENDE ) ){
    	              clients.remove( add );
    	              System.out.println( "Anzahl Clients: " + clients.size() );
    	           }  else {
    	              for( int i=0; i<clients.size(); i++ ) {
    	                InetSocketAddress dest = (InetSocketAddress) clients.get(i);
    	                if( ! dest.equals( add ) ) {
    	                   paket.setSocketAddress( dest );
    	                   socket.send( paket );
    	                   System.out.println( "Kopie an " + dest );
    	                }
    	              }
    	           }
    	        }
    	      }
    	      catch( IOException e ) {
    	         System.err.println( "Ausnahmefehler: " + e );
    	      }
    	   }
}
```

PLZ help


----------



## DosCoder (19. November 2009)

Hi,
bei Eingabe von "java chat tutorial" in Google kommt gleich unter den ersten fünf ein vollständiges Tutorial. Du kannst also nicht allen Ernstes behaupten, du hättest fleißig gesucht. Hier der Link zum Tutorial: http://www.cn-java.com/download/data/book/socket_chat.pdf(Achtung PDF-File)
Ciao
DosCoder


----------



## Prengepower (19. November 2009)

DosCoder hat gesagt.:


> Hi,
> bei Eingabe von "java chat tutorial" in Google kommt gleich unter den ersten fünf ein vollständiges Tutorial. Du kannst also nicht allen Ernstes behaupten, du hättest fleißig gesucht. Hier der Link zum Tutorial: http://www.cn-java.com/download/data/book/socket_chat.pdf(Achtung PDF-File)
> Ciao
> DosCoder



ja naja ich habe schon so einiges gefunden, aber nichts so wirklich womit meine fragen beantwortet waren, sonst würde ich hier ja kein thema dazu aufmachen 

mfg


----------



## DosCoder (19. November 2009)

Hi,
und was funktioniert am obigen Programm nicht? 
Ciao


----------



## Prengepower (19. November 2009)

ich habe halt keine ahnung wie ich weitermache wenn ich den server gestartet hab wenn ich auf verbinden klicke soll sich ja der client zum server verbinden beleibt der denn dauerhaft verbunden?! wie kann ich aus einem anderen fenster heraus nachrichten an den server verschicken und der verteilt se dann an die anderen clients?! Wie kann ich klassen verschicken? 

mfg


----------



## DosCoder (19. November 2009)

Hi,
also dein Codebeispiel schaut mir viel zu kompliziert aus.
Der Server besteht aus nichts anderem ServerSocket, der darauf wartet, dass sich jemand anmeldet, und einem Thread, der auf eingehende Nachrichten wartet und sie an alle verschickt.
Der Server selbst braucht eigentlich keine grafische Benutzeroberfläche, da er ja eigenständig arbeitet.

Dein Klient besteht aus einem Socket, der sich mit dem Server verbindet, einem Thread, der Nachrichten verschickt (über den Outputstream des Sockets) und einen Thread, der Nachichten vom Server empfängt(über den Inputstram des Sockets). Ich weiß ja nicht, woher du den Codeschnippsel hast, aber InetSockets & Co brauchst du für einen einfachen Thread nicht. 

Arbeite das Tutorial doch einfach mal durch, denn wie gesagt, dein Code erscheint mir viel zu kompliziert.

Ciao
DosCoder


----------



## Prengepower (19. November 2009)

okay...
naja der server soll halt nur ausm programm heraus gestartet werden aber so ansich nichts weiter anzeigen außer server gestartet und server beendet... aber das ist ja kein problem! gut das mit dem thread erscheint mir jetzt schon verständlicher...

also starte ich den server in einem thread und den client in einem thread... beim nachrichten verschicken wird wiederrum ein thread aus dem client aufgerufen der die nachricht verschickt... und es läuft die ganze zeit noch ein thread im hintergrund der darüber wacht das neue nachrichten kommen... hab ich das jetzt richtig verstanden?

mfg


----------



## DosCoder (22. November 2009)

Hi,
sorry für die späte Antwort, ich hatte früher keine Zeit...

Ich verstehe deine Aussage nicht: "der Server soll aus einem Programm gestartet werden?"



> _also starte ich den server in einem thread und den client in einem thread_


Der Server und der Client sind zwei Programme, die fast immer auch auf verschiedenen PCs laufen. Der Server solte natürlich rund um die Uhr laufen, damit man sich immer Anmelden kann.
Mehr will ich aber nicht dazu sagen, da ich das ganze Thema schon mal durchgekaut habe:
http://www.tutorials.de/forum/java-grundlagen/338345-jchat.html
Einfach durchlesen und bei konkreten Unklarheiten fragen.

Ciao
DosCoder


----------



## Prengepower (23. November 2009)

also ich hatte das so angedacht, dass alle leute das programm auf ihrem rechner haben und einer klickt dann den button "hosten"... dadurch wird der server auf seinem rechner gestartet (dürfte ja als thread im programm reichen oder?) und die anderen können sich dann mit dessen IP + Port zu ihm verbinden... Er selbst verbindet sich auf seinem PC auch mit dem server...

passt des?

hab mich jetzt so ansich für RMI oder SIMON entschieden... Was genau weiß ich noch nicht? Ansich wäre ja SIMON besser, weil es übers Internet laufen soll und da macht sich SIMON ja besser ne?

mfg


----------



## DosCoder (23. November 2009)

Hi,
also theoretisch ginge das, du bräuchtest aber +2 Threads für deinen Server. 1, der neue Clients entgegen nimmt, und einer pro Client. (siehe anderer Chat-Thread). Einen einfachen Chat kann man auch mit Streams realisieren, dazu brauchst du kein RMI & C (siehe Tutorial).

Ciao
DosCoder


----------



## Prengepower (24. November 2009)

DosCoder hat gesagt.:


> Hi,
> also theoretisch ginge das, du bräuchtest aber +2 Threads für deinen Server. 1, der neue Clients entgegen nimmt, und einer pro Client. (siehe anderer Chat-Thread). Einen einfachen Chat kann man auch mit Streams realisieren, dazu brauchst du kein RMI & C (siehe Tutorial).
> 
> Ciao
> DosCoder



Okay... Ich bräuchte für jeden anderen Client einen extra Thread?! Also sobald sich ein Client verbindet muss für den nen neuer Thread gestartet werden 

Ja ich weiß, dass ich für nen Chat kein RMI benötige, aber der Chat ist nur ein Teilprogramm von meinem richtigen Programm. Dabei handelt es sich nämlich um einen Multiusereditor. Leider hatte mein Thema hier im Forum dafür nicht soviel anklang... Hier mal der Link, dass du dir das vll durchlesen kannst: Multiusereditor

Vielen Dank schonmal


----------



## DosCoder (24. November 2009)

Hi
soweit sind deine Überlegungen korrekt, aber einen kleinen Fehler habe ich noch gefunden (vllt. hast du das schon gelöst?): Wenn einer auf "Host" klickt, soll ja der server gestartet werden, damit andere sich anmelden können. Woher wissen die anderen User aber, unter welcher IP? Die ändert sich ja ständig.

Zu deinem Masterproblem: Ich finde auch, dass für den Anfang die 1. Variante nimmst, also dass in so einem Fall der Server entscheidet.

Aber RMI brauchst du immer noch *unbedingt*. Die Frage ist, ob du dich damit befassen willst, oder um das Programm schnell fertig werden soll. Für Letzteres kannst du die Daten, die du verschicken willst (Zeichen+Postion+...) einfach in String zusammen fassen; der Server schickt sie unangetastet weiter und die anderen Klienten spliten den String dann wieder. Wie gesagt, ist deine Entscheidung, wie viel Zeit du da reinstecken willst ...

Ciao
DosCoder


----------



## Prengepower (24. November 2009)

also ich hab mich jetzt so ansich schon ein wenig mit RMI befasst... Meinst du wirklich, dass RMI soviel länger dauert? Ich wollte das ganze Spielchen diese Woche eigentlich fertig kriegen - wenigstens den Chat!

Das mit der IP wollte ich so lösen, dass in einem Fenster der Hoster seine IP + Port angezeigt bekommt und dann muss er per Telefon etc. den anderen die IP zuschicken... Wüsste nicht wie es anders gehen soll...

Mfg


----------

