Zum Inhalt springen

Java Chatserver


speedi

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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){


		}

	}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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();}

}

}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...