[Java] Chat selbst bauen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von die_kackwurst, 18. November 2009 .

Schlagworte:
  1. 18. November 2009
    Chat selbst bauen

    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:
    Code:
    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
     
  2. 18. November 2009
    AW: Chat selbst bauen

    Also wie ich sehe hast du dich schonmal für DatagrammSockets entschieden. Damit hast du dir eine Menge Arbeit abnehmen lassen weil du damit ja ganz einfach mit den jeweiligen Adressen agieren kannst. Jedoch durch die Datagramme wird deine An- und Abmeldung nur von Nöten damit du in deinem Tree den Namen hast.

    So jetzt mal richtig zu deinem Problem...

    mit text hast du ja schon den Inhalt deiner Nachricht. Diesen gilt es nun in ein neues DatagrammPaket zu schreiben und dann wieder zu senden, da du ja im Moment total leere Pakete sendest:

    Code:
    paket = new DatagramPacket(text.getBytes(),text.getBytes().length);
    paket.setSocketAddress( dest );
    socket.send( paket );
    Sollte mit der neuen Zeile getan sein. Mit der for schleife werden dann automatisch alle clients abgearbeitet
     
  3. 18. November 2009
    AW: Chat selbst bauen

    Genau das gleiche haben wir letzes jahr im Informatik unterricht gemacht
    wir haben jedoch für den Server und die Socketverbindungen bla vorher ne bibliothek geschrieben.
    Und wir sollten die User auch in nem tree verwalten, ist aber total unsinnig..lohnt erst ab nen paar tausend usern, habs mit ner hashtable gemacht. wenn du willst kann ich dir das projekt zukommen lassen, dann kannstu es dir mal anschauen
     
  4. 18. November 2009
    AW: Chat selbst bauen

    danke für eure antworten.. ja also meine fragen sind immerno nicht vom tisch. hab noch keine ahnung so wirkli wo ich es machen kann das der user in nem tree kommt. genausowenig weiß ich wo der ganze quatsch mit der verbindung zum server hinkommt. immer wenn ich auf den senden-button klicke?? oder wie läuft das??

    ich muss auch nicht nur nachrichten senden sondern auch noch eine komplette klasse weil ich ansich an einem multiusereditor arbeite... habe dazu noch einen anderen thread eröffnet wo sich aber niemand so wirkli zu wort gemeldet hat...

    welche übertragungsweise wäre denn besser? bleibt der client dauerhaft mit dem server verbunden? wie kann ich dem server einen username und dessen farbe übermitteln sodass diese eigenschaften auch an alle anderen clients übermittelt werden?

    ich habe echt noch soviele fragezeichen vor mir...

    es wäre super wenn du mir das projekt mal per pm zukommen lässt... bitte natürli als quellcode ;-)

    danke schonma...
     
  5. 18. November 2009
    AW: Chat selbst bauen

    ich hatte sowas in meiner berufsabschlussprüfung. WIr haben MIt Inputstreamreader und Printwriter gearbeitet und natürlich das thema sockets . einen tree brauchst du nicht, du könntest die clients verbinden lassen und ein field machen in dem jeder client hinzugefügt wird. nur als beispiel.


    Code:
    ServerSocket serverSock = new ServerSocket(5000);
    beispielport 5000

    damit erstellest du einen server, die ip des server musst du natürlich ermitteln, bspl. localhost

    Code:
    sock = new Socket("127.0.0.1",5000);
    so verbindest du den client mit dem server
    127.0.0.1 ist der localhost und darüber musst du mit den streamsarbeiten (datenaustausch)
     
  6. 19. November 2009
    AW: Chat selbst bauen

    okay aber könnte ihr mir bitte nochmal helfen...

    Button Hosten --> Server wird gestartet (server.start()).
    Button Verbinden --> Client wird gestartet und bleibt dauerhaft in Verbindung (client.start())
    Button Verbindung trennen --> Client trennt sich vom Server (client.stop()).

    Ist das soweit in Ordnung? Oder verbindet sich der Client immer nur mit dem Server wenn ich auf den Button senden klicke?

    Button Senden --> Nachricht soll gesendet werden... Aber wie?!?! Ich weiß wie ich einen Server ansich aufsetze mit Port usw... Auch wie ein Client eine Verbindung dazu herstellt. Aber ich habe keine Ahnung wie ich eine Nachricht dann zum Server verschicke und der diese dann an den Rest verteilt.

    Außerdem meine Frage: Sind nun Sockets oder DatagramPackets besser?! Kann ich über beides auch komplette Klassen übertragen?! Wie?

    Ich will eine Klasse "Änderung" mit den Eigenschaften Farbe, Punkt, Zeichen ebenfalls von einem an alle Clients verschicken. Genauso dann auch die Klasse Benutzer mit den Eigenschaften Name und Farbe...

     
  7. 19. November 2009
    AW: Chat selbst bauen

    Nimms mir nicht übel aber du willst einen Chat schreiben hast aber keinen blassen Schimmer wie man mit Sockets umgeht, geschweige denn kennst du nicht mal gängige Programmiermuster?!

    Bevor du dich an so etwas ranwagst solltest du dir im Klaren sein dass du das Ganze gut durchdenken solltest.

    Als erstes solltest du natürlich überlegen WIE deine Daten über das Netz kommen. TCP oder UDP. Da es bei nem Chat nicht zeitkritisch ist empfehle ich dir TCP zu verwenden.
    Um dann wirklich Daten übers Netz zu verschicken gibts ne einfache Klasse. ---> DataOutputStream. Da musste nur die Methode writeUTF() verwenden dann schickt er dir nen normalen String übers Netz. Wird für den Anfang wahrscheinlich auch das Beste sein.

    Ganz ganz wichtig ist auch dass du dir ein Protokoll überlegst!! Das sollte möglichst einfach zu erweitern sein, falls du später weitere Felder dem Protokoll hinzufügen willst.
    Möglich wäre z.B.

    <control-flag>¿<room>¿<nick>¿<timestamp>¿<message>

    Dann solltest du nicht außer Acht lassen dass du auch bei Fehlern entsprechend reagierst. D.h. du solltest eventuell einen KeepAlive-Thread für jeden Client laufen lassen.

    Was ich sagen will ist. Überleg lieber vorher WIE du es machst denn du sparst dir somit einen Haufen arbeit danach.

    Wenn du noch jemanden suchst der dir dabei aktiv hilft, biete ich dir meine Dienste gerne an xD
    Wollte auch schon lang mal nen anständigen Chat schreiben aber nie jemanden gefunden...
    Alleine ists ja auch langweilig

    ---------- EDIT ----------
    btw ist es auch möglich komplette Klassen zu übertragen. Jedoch rate ich dir davon ab da dabei nur unnötige Bytes verschickt werden. Außerdem schickst du da nicht nur das Objekt weg, welches du verschicken willst sondern auch jedes Objekt auf das das verschickte Objekt eine Referenz hat!! (nicht gut ^^)
     
  8. 20. November 2009
    AW: Chat selbst bauen

    dakne danke... hab mich jetzt schonmal ein bisschen in RMI eingelesen und finde das eigentlich sehr gut für mein vorhaben muss mich noch ein bisschen weiter informieren aber ansich schon ganz gut so ^^

    falls ich nicht weiterkomme kann ich mich ja nochmal bei dir melden...
    und ich hab schon ahnung von programmierung... hab des jetzt im 3. semester und davor schon 3 jahre programmiert also da is scho was da... hab aber halt no nie was mit netzwerk gemacht - deswegen sind das halt viel viele fragen

    mfg
     
  9. 20. November 2009
    AW: Chat selbst bauen

    seit 3 jahren programmierst du schon weißt aber nicht wie du nachrichten an alle clients verschicken sollst?! Oo

    und glaubst du wirklich dass rmi die beste lösung für nen chat ist?
     
  10. 21. November 2009
    AW: Chat selbst bauen

    ja na wenn ich noch nie was mit netzwerk gemacht hab... woher denn?

    na es is ja nicht nur nen chat sondern nen multiusereditor - siehe mein anderer thread... der chat is nur eine funktion sozusagen...

    warum was wäre besser? hatte wegen internetfähigkeit no an simon gedacht...
     
  11. 21. November 2009
    AW: Chat selbst bauen

    das hat mit netzwerk rein garnichts zu tun. schonmal was vom observer pattern gehört??
    du musst das einfach nur nachimplementieren und gut ist. so bekommt jeder (client)proxy mit, wenn jemand ne nachricht geschickt hat
     
  12. 23. November 2009
    AW: Chat selbst bauen

    okay ne hab ich noch nix von gehört ^^ aber danke für den tipp - werd ich mir mal reinziehen

    mfg
     
  13. 23. November 2009
    AW: Chat selbst bauen

    im prinzip reicht es auch wenn du weißt wie du eigene events schreibst. im prinzip ist nämlich ne eingehende nachricht am server nichts anderes als ein event.. vllt finde ich meinen alten chat noch irgendwo dann kann ich dir den mal schicken
     
  14. 24. November 2009
    AW: Chat selbst bauen

    das wäre natürlich ganz cool ne... hast den au mit RMI gemacht?
     
  15. 24. November 2009
    AW: Chat selbst bauen

    eventuell hilft dir das, ist ausbaufähig aber läuft. http://www.indimension.de/blog/?page_id=237
     
  16. 24. November 2009
    AW: Chat selbst bauen

    nein. der verbindet sich direkt mit nem socket. ich find auch rmi ist nicht wirklich das richtige für nen chat
     
  17. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.