speedi Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Hi Leute, ich muss mit Java einen kleinen Chatserver programmieren. Solange nur ein Benutzer mit einem Server kummuniziert geht das auch wunderbar aber wie stelle ich es an das mehrere Clients auf einen Server connecten und der Server eingehende Nachrichten auch an alle Clients gesendet werden? Hat jemand sowas schon mal gemacht? und weis wie man sowas in etwa angehen kann? Zitieren
perdian Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Hat jemand sowas schon mal gemacht? und weis wie man sowas in etwa angehen kann?Ja und Ja Du musst beim Login eines Clients, diesen auf dem Server irgendwo in einem Lookup halten. Soll eine Broadcast-Nachricht an alle Clients gesendet werden, gehst du nun alle eingetragenen Clients in diesem Lookup durch und verschickst die Nachricht an jeden einzelnen. Beim Logout (oder einem Ping-Failure) eines einzelnen Clients trägst du diesen dann wieder aus dem Lookup aus. Zitieren
speedi Geschrieben 19. Juli 2005 Autor Geschrieben 19. Juli 2005 Ja und Ja Du musst beim Login eines Clients, diesen auf dem Server irgendwo in einem Lookup halten. Soll eine Broadcast-Nachricht an alle Clients gesendet werden, gehst du nun alle eingetragenen Clients in diesem Lookup durch und verschickst die Nachricht an jeden einzelnen. Beim Logout (oder einem Ping-Failure) eines einzelnen Clients trägst du diesen dann wieder aus dem Lookup aus. Du meinst sowas wie ne verkettete Liste? Mhhh... Hast recht das sollte funktionieren. Thnx! Zitieren
BigAndi Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Am besten ein Array mit den verbundenen Usernamen (musst dafür sorgen, dass die Namen eindeutig sind), dass du, wie perdi schon sagte, immer aktuell hältst. Sprich neu eingeloggte user eintragen, bevor sie endgültig loschatten können und ausgeloggte user / Ping Failure rausnehmen. Ist auch ganz wichtig die Liste zu haben, wenn man zum Beispiel private Dialoge einbauen will. Zitieren
speedi Geschrieben 19. Juli 2005 Autor Geschrieben 19. Juli 2005 Am besten ein Array mit den verbundenen Usernamen (musst dafür sorgen, dass die Namen eindeutig sind), dass du, wie perdi schon sagte, immer aktuell hältst. Sprich neu eingeloggte user eintragen, bevor sie endgültig loschatten können und ausgeloggte user / Ping Failure rausnehmen. Ist auch ganz wichtig die Liste zu haben, wenn man zum Beispiel private Dialoge einbauen will. Und dann gleich noch ne Frage: Einer meiner Ausbilder meinte es gäbe irgendwie von BufferedWriter ne Option das der sich selbst flusht? Ich habe nämlich auch immer Probleme wenn ich mit gebufferten Streams arbeite. Im Prinzip mache ichs dann genauso wie mit normalen nur das halt nach dem schreiben des BufferedWriters nochmal out.flush() sage, aber dann bleibt mein Programm immer irgendwie stecken und nimmt nichts mehr entgegen. Zitieren
BigAndi Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 So habe ich es bisher auch immer gemacht... Kommen deine Nachrichten denn beim Server an? Eventuell sinds ja auch Verbindungsprobleme, und der Server bremst den Chat aus. Zitieren
perdian Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Du meinst sowas wie ne verkettete Liste? Mhhh... Hast recht das sollte funktionieren.Ob du eine verkettete Liste, ein Array, eine Map, oder eine andere Datenstruktur nimmst ist erstmal egal. Es gibt performantere und weniger performante Lösungen. Aber du soltest für dich erstmal die generellen Konzepte ausarbeiten, was in diesem Fall heisst generell irgendein Lookup zu implementieren - in was für Strukturen du die Clients speicherst ist da zweitrangig. Und dann gleich noch ne Frage: Einer meiner Ausbilder meinte es gäbe irgendwie von BufferedWriter ne Option das der sich selbst flusht?Beim BufferedWriter gibt's nichts dergleichen, aber PrintWriter bietet einen Konstruktor mit autoFlush. nur das halt nach dem schreiben des BufferedWriters nochmal out.flush() sage, aber dann bleibt mein Programm immer irgendwie stecken und nimmt nichts mehr entgegen.Dann liegt das Problem aber nicht am BufferedWriter - mit einem autoFlush würdest du dann auch nicht besser dastehen. Flush heisst ja nichts anderes als die Daten, sofern sie noch irgendwo gecached sind, tatsächlich an den Empfänger zu senden. Ob ich das nun automatisch machen lasse oder manuell anstoße macht für die weitere Verarbeitung keinen Unterschied. Dein Problem liegt daher bei der Übermittlung der Daten - wahrscheinlich blockt der Empfänger und nimmt keine Daten an. Das erzeugt dann den Effekt, dass der Writer auf Client-Seite scheinbar nichts mehr annimmt. Zitieren
speedi Geschrieben 19. Juli 2005 Autor Geschrieben 19. Juli 2005 Ohje das Problem ist größer als gedacht: Ich stehe grad so richtig auf dem Schlauch. Bin grad dabei nochmal ne Verbindung zwischen zwei PCs in beide Richtungen herzustellen. Aber irgendwie funzts nicht. Server: import java.net.*; import java.io.*; public class Server { public static void main(String[]args){ try{ ServerSocket server = new ServerSocket(8189); Socket socket = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(),true); System.out.println("Warte auf InputStream..."); String s = in.readLine(); System.out.println("Schreibe in OutputStream..."); out.write("Nachricht: "+s); }catch(IOException e){ System.out.println(e); } } } ] Client: import java.io.*; import java.net.*; public class Client { public static void main(String [] args){ try{ Socket s = new Socket("REGINA",8189); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(s.getOutputStream(),true); out.write("Hallo"); System.out.println("Nachricht: "+in.readLine()); }catch(IOException e){ } } } Zitieren
BigAndi Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Du brauchst zum empfangen der NAchrichten definitiv einen Thread. Ist ein bischen aus dem Zusammenhang gerissen, aber das Prinzip sollte klar werden. Der Client und der Server nutzen bei mir den ReadThread zum Empfangen der Nachrichten: import java.io.*; import java.net.*; public class ReadThread extends Thread{ private Network net; private String input; public boolean active = true; private int nr; public ReadThread(Network net, int nr) { super(); this.net = net; this.nr = nr; } public void run() { while(active) { try { input = net.sIn[nr].readLine(); if (input != null) { net.messageHandler(input);//Irgendwas mit der Nachricht anstellen } else { net.log("Verbindung abgebrochen!"); net.killClient(nr); net.stopClient(); break; } }catch(Exception e){net.log("Verbindung abgebrochen!"); net.killClient(nr); net.stopClient();} } } } Zitieren
perdian Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Aber irgendwie funzts nicht.WAS funktioniert nicht? Zitieren
BigAndi Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Würde sagen, dass die Nachricht nicht ankommt. Wie gesagt, normalerweise hört ein Thread den Socket permanent ab.... Zitieren
BigAndi Geschrieben 19. Juli 2005 Geschrieben 19. Juli 2005 Also speedi, ich hab vor geraumer Zeit mal nen kleines 2 Spieler spiel geproggt, was über Netzwerk gegeneinander möglich ist und einen chat enthält. Ich hab den Chat damals so gebaut, dass er durchaus auch als "handelsüblicher" Chat verwendet werden könnte, also für mehr als 2 User Wenn du magst, schick mir ne PN mit ner eMail Addy von dir, dann würde ich dir den Code zuschicken, da solltest du, auch wenn er weitgehend unkommentiert ist, alles finden, was du brauchst. Aber als Gegenleistung würde ich dann ne PN von dir Erwarten, mit ner Meinung über mein Spielchen und falls dir dabei tolle Ideen kommen, mit Vorschlägen :mod: Zitieren
speedi Geschrieben 19. Juli 2005 Autor Geschrieben 19. Juli 2005 Würde sagen, dass die Nachricht nicht ankommt. Wie gesagt, normalerweise hört ein Thread den Socket permanent ab.... Normalerweise Sollte der Client ein "Hallo" zum Server schicken. Dieser fängt es auf und schickt es zurück. Ich kann mir nicht vorstellen das man für sowas simples schon Multithreading braucht. Vor allem weil es ja mit einfachen Streams funktioniert nur nicht mit gepufferten. Das Problem scheint an der Stelle zu liegen wo der Server den Stream vom Client bekommt. Der Client schickt es raus. Aber auf dem Server scheint nichts anzukommen. Zitieren
speedi Geschrieben 19. Juli 2005 Autor Geschrieben 19. Juli 2005 Also speedi, ich hab vor geraumer Zeit mal nen kleines 2 Spieler spiel geproggt, was über Netzwerk gegeneinander möglich ist und einen chat enthält. Ich hab den Chat damals so gebaut, dass er durchaus auch als "handelsüblicher" Chat verwendet werden könnte, also für mehr als 2 User Wenn du magst, schick mir ne PN mit ner eMail Addy von dir, dann würde ich dir den Code zuschicken, da solltest du, auch wenn er weitgehend unkommentiert ist, alles finden, was du brauchst. Aber als Gegenleistung würde ich dann ne PN von dir Erwarten, mit ner Meinung über mein Spielchen und falls dir dabei tolle Ideen kommen, mit Vorschlägen :mod: Danke für das angebot! Ja gern kannst mirs mal schicken vielleicht bringts mich ja bissal weiter. Addy ist: bergedaniel01@arcor.de Zitieren
speedi Geschrieben 21. Juli 2005 Autor Geschrieben 21. Juli 2005 @BigAndi: Lustiges Spiel! :uli Hat aber noch ein paar Fehler. Außderdem hab ich mal versucht das über Lan zu Spielen. Habs aber nicht so ganz geschafft. Übrigens weis ich jetzt woran es lag das mein Programm sich festgefahren hat. out.close(); vergessen! :mod: Zitieren
BigAndi Geschrieben 21. Juli 2005 Geschrieben 21. Juli 2005 Manchmal sind es die kleinen Dinge des Lebens, die große Probleme machen Ich persönlich mag die Sonderfunktion der Pfeiltasten. Auf einem PC bringts nicht viel, aber im Netz eröffnet das völlig neue Möglichkeiten :eek Sollte an dem Spiel mal wieder weitermachen - steht auf meiner Liste, wenn das aktuelle Projekt fertig ist. Aber im Netz müsste es funzen - habs gestern noch mit nem Arbeitskollegen (selbstverständlich in der Pause) gespielt...Der den Server Stellt gibt den Port an und klickt auf Start in der Server-Sektion. Der Client gibt den gleichen Port an, wie der Server und klickt dann "Connect to Server" an, trägt die IP des Servers ein und klickt "Start" - dann steht die Verbindung und der Server kann das Spiel starten... Hast übrigens net die aktuellste Version gekriegt, wie mir grad auffällt, gibt noch eine, wo ein paar kleine Bugs gefixed sind. Aber die Netzvariante funzt bei mir trotzdem Zitieren
speedi Geschrieben 21. Juli 2005 Autor Geschrieben 21. Juli 2005 Ahh! Jetzt funzt es bei mir auch üner Netzwerk. Aber ich hab vorhin grad gegen nen Kollegen gewonnen bei so einer Konstellation: o = rot x = blau xoooxxo Tja da sind zwar vier rote in ner reihe aber müssen die nicht zusammen hängen? Auf jeden Fall danke dein Chatbeispiel hat mir sehr weitergeholfen. Jetzt hab ich meine Aufgabe schon fertig. Habs aber ganz schön anders gemacht am Ende. Was ich zum Beispiel nicht benötigt hab war diese Klasse "Network". Übrigens: Hab den Chat momentan über "telnet" laufen. Weis jemand wie man da ne Zeile tiefer gehen kann? Wenn ich nämlich was schreibe rück der Cursor immer weiter ein und wenn ich dann "\n" mache geht er zwar in ne neue Zeile bleibt aber immernoch an der gleichen x-position. Zitieren
BigAndi Geschrieben 21. Juli 2005 Geschrieben 21. Juli 2005 Hab die kombi getestet, ist nicht gewonnen, außer du hast in den optionen # der Gewinnsteine mit 3 stehen... die kombi xoooxxx ist aber definitiv gewonnen und das macht auch sinn....stell sie mal nach, bestätige das gewinnfenster mit ok und spiel mal mit den pfeil-links bzw pfeil-rechts Tasten rum (kannst du auch während des Spiels machen) dann wirst du sehen warum...ich sag nur Spielfeld scrollbar = mehr Gewinnoptionen & mehr Spielspaß Die Networkklasse ist als solche auch nicht zwingend nötig. Hab sie gebastelt um sie übersichtlich in den Spielcode einzubringen, erleichterte mir das debuggen.... bei deinem neuen Prob kann ich leider nicht weiterhelfen, sorry. Zitieren
geloescht_Newlukai Geschrieben 22. Juli 2005 Geschrieben 22. Juli 2005 Unter Windows besteht ein ENTER aus 2 Zeichen: \n\f Zitieren
speedi Geschrieben 25. Juli 2005 Autor Geschrieben 25. Juli 2005 Unter Windows besteht ein ENTER aus 2 Zeichen: \n\f Ahhhh! Danke! 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.