FriedOfJava Geschrieben 18. Januar 2011 Geschrieben 18. Januar 2011 Hallo liebes Forum, ich bin schon seit einigen Jahren am Programmieren mit Java und wollte nun endlich mal in die Netzwerkprogrammierung eintauchen. Soweit, so gut. Ich hab mir auch das Buch von Guido Krüger und Thomas Stark gekauft - "Handbuch der Java Programmierung", was ich allgemein jedem ans Herz legen kann, wenn er es eh nicht schon hat. Unter anderem wird da auch ein Echo-Server erklärt. Also X-Clients können auf einen Server verbinden, der ihnen dann jeweils ihre Eingabe zurück gibt. Auch das kein Ding für mich, habe ich auch verstanden. Wo es jetzt bei mir aber hängt ist, wie mache ich aus dem Echo-Server einen Chat-Server, also dass alle Nachrichten an alle verbundenen Clients geschickt werden? Ich bekomm' da einfach die Logik nicht raus, wie ich mit den Streams und Threads arbeiten muss (Threads sind da auch relativ neu für mich, fragt nicht, mit was ich mich die ganzen anderen Jahre aufgehalten hab :schlaf: ) Das ist wohl auch ein viel gefragtes Thema im Netz, aber die bisherigen Posts, die ich gefunden habe, waren für mich eher unbefriedigend. Ich liste mal kurz auf, wie es momentan bei mir ausschaut: 1. Der Server wird gestartet und wartet auf einen Client. 2. ServerSocket.accept() gibt mir den Socket des Clients aus, mit dem ich dann einen ClientThread starte. Er bekommt eine eigene Nummer und den Socket übergeben. 3. im Thread höre ich auf Eingaben des Clients, indem ich vom Socket den In- und OutputStream nehme. Bekomme ich nun was durch den InputStream rein, lese ich es aus und schreibe es direkt wieder in den OutputStream (das EchoPrinzip - und ich denke, hier müsste ich irgendwie ansetzen, es an alle Clients zu schicken!?) Noch die Auflistung, wie es beim Client derzeit ausschaut: 1. Beim Start wird ein neuer Socket erzeugt, mit der Addresse "localhost" und dem Port 2. Ich nehme meinen In- und Outputstream vom Socket 3. Ich erzeuge einen AusgabeThread, mit meinem InputStream, der darauf wartet, dass ich etwas bekomme. Dies wird dann in der Konsole ausgegeben 4. Parallel dazu lese ich in einer Endlosschleife über die Konsole ein, was eingeben wird und schicke es mit dem OutputStream los. 5. Daraufhin folgt eine Methode, die ich aus dem Buch habe, nämlich, dass ich den AusgabeThread anspreche und die Methode yield() ausführe. Was genau ist deren Sinn? Wenn mir jemand Gedankenanstöße geben kann, oder auch direkt sagt, wie es zu machen wäre, ist das ganz große Klasse! Ich hoffe das war nicht zu viel Input und ich bedanke mich für jeden Kommentar Vielen Dank. Zitieren
kingofbrain Geschrieben 18. Januar 2011 Geschrieben 18. Januar 2011 Die zusätzliche Aufgabe des Servers muss es sein, gleichzeitig als Client agieren zu können (zumindest ist das der Standardfall). Er muss sich also irgendwo merken, welche Clients noch anzusprechen sind, und diese dann im Fall einer Nachricht von einem Client aktiv ansprechen. Schöne Grüße, Peter Zitieren
flashpixx Geschrieben 18. Januar 2011 Geschrieben 18. Januar 2011 Man kann einen Chat auf verschiedene Weisen realisieren. Der Server hört auf einen Connect von den Clients, wenn der Client verbunden ist und ihm eine Nachricht übergibt, kann der Server eben direkt die Daten an die anderen Clients senden (push) oder jeder Client fragt den Server in gewissen Zeitabständen ab, ob neue Nachrichten für ihn da sind (pop). Rein technisch kennt der Server den Client und der Client seinen Server, so dass die Kommunikation auch direkt funktioniert. Der Server macht lediglich nicht anderes als eine eingehende Nachricht zu duplizieren und zu versenden. Der Server hat ja die Verbindung zu jedem Client und pushed damit die Nachricht zum Client. In der andere Variante (pop) speichert der Server die Nachricht zwischen und der Client fragt eben ab, ob Daten vorhanden sind. D.h. der Client muss eine Information an den Server senden, so dass dieser die gespeicherten Nachrichten ausliefert. Wenn das ganze eh nur in einem LAN nutzbar sein soll, dann wäre evtl Multicast ? Wikipedia etwas dafür, denn damit braucht man keinen Server. Zitieren
FriedOfJava Geschrieben 18. Januar 2011 Autor Geschrieben 18. Januar 2011 Der Server macht lediglich nicht anderes als eine eingehende Nachricht zu duplizieren und zu versenden. Der Server hat ja die Verbindung zu jedem Client und pushed damit die Nachricht zum Client. Ja, das habe ich mir auch schon gedacht, nur mein Problem ist: Der Server hat ja für jeden Client einen Thread am laufen, der die Eingaben halt direkt an den Client wieder zurück sendet. Der Thread kennt den Server ja nicht, und auch andere ClientThreads nicht. Somit hab ich zwar die Nachricht, aber keine Möglichkeit sie an einen anderen Client, als den, der sie geschickt hat, zurück zu senden. Ich nehme mal an, dass dann an der Grundstruktur was falsch ist? Zitieren
flashpixx Geschrieben 18. Januar 2011 Geschrieben 18. Januar 2011 (bearbeitet) Ich nehme mal an, dass dann an der Grundstruktur was falsch ist? Ja ist es. Der Server _muss_ global den Zugriff auf die Verbindung zu den Clients haben, eben auch wie er Zugriff auf die zentrale Nachrichten Queue haben muss (und die Zugriffe müssen natürlich passend synchronisiert werden). Oder Du nutzt direkt Multicast Bearbeitet 18. Januar 2011 von flashpixx Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.