Java Chat Beispiel
-
Hallo,
in einem Thread hier unter mir war mal die Rede von einem Chat und es wurde ein Beispiel angegeben.
Da ich mich auch dafür interessiere klickt ich gleich mal auf
http://java.seite.net/chat/index.html
und programmierte gleich mal drauf los.
Nur eins ist mir aufgefallen bei dem tutorial,
in der Server-Klasse werden ja alle Verbindungen in einem Vector gespeichert, nur was passiert wenn sich ein Client disconnected?
Dann bleibt der Vector mit Verbindungen gefüllt die es nichrt mehr gibt.
Da dachte ich mir nun, gut frage ich halt in der Schleife ab, ob die Verbindung noch besteht und wenn nicht, raus damit.
Nur leider haben alle Versuche nicht geklappt.
Was kann man da machen?
Also in der Methode des Servers:public void broadcast(String msg) { int i; connection you; for (i=0; i<connections.size(); i++) { you = (connection) connections.elementAt(i); you.out.println(msg); } }
Da dachte ich in der For-Schleife an ein:
if( !you.client.isConnected() ) { ... }
aber das klappt so nicht.
-
Hi
Schreib doch um die you.out.println einen try catch block. wenn dort eine TimeoutException geworfen wird (oder eine andere), ist es warscheinlich, das der client nicht mehr existiert und du kanst ihn rausschmeissen.
ggf solltest man sich überlegen ob man nicht noch eine art Kommandointerpreter für die einzelnen Verbindungen auf dem server einrichtest. Um z.B. die eingelogten benutzter abfragen zu können, eine zugangsberechtigung zu implementieren,... Hir währe dann auch der ort für ein ordentliches abmelden.
Der Client schickt das Komando close an den Server und damit kann der Server dann die verbindung trennen ( ggf schickt er noch dem klient eine bestätigung das er verstanden hat) Der server kann dann noch alle anderen teilnehmer darüber unterrichten, das User X den chat verlassen hat.
gruss Termite
-
Hallo,
du könntest beim Disconnecten z.B. einen Quit-Befehl senden.
Wenn der Connection-Thread dann diesen "Befehl" empfängt, kann er sich mittels interrupt() und isInterrupted() selbst beenden und vorher noch eine Methode des Servers aufrufen, in der diese Connection aus dem Vektor entfernt wird.
Mit der remove-Methode kannst du ein Element aus dem Vektor entfernen.z.B. in der Serverklasse:
protected static Vector connections; //... public static void removeConnection(Connection con) { connections.remove(con); }
MfG
-
Hey, danke ihr beide. Das hat mir weitergeholfen.
Das mit der Excepion hat leider nicht geklappt, da keine aufgetreten ist, aber nun hab ich ein kleines Protokoll implementiert, mit dem sich Client und Server unterhalten.
-
So ich bins nochmal,
ich hab noch ein PRoblem. Sobald sich jemand disconnected wird der Server tierisch lahm und ich weiß einfach nicht woran das liegt.
Hat vielleicht jemand von euch Zeit und Lust da mal rein zu schauen?
Liegt als eclipse Project gezipped vor unter:
http://www.heavenfighter.net/test/server.zipDanke für eure Mühen...
-
Hi
was sehen meine müden augen da?
public static void main(String[] args) { new Server(); // was ist denn das ? eine instanz die wir gleich // wieder vergessen. Sieht zumindestens in der main // so aus. sowas gehört eigentlich verboten, // rein vom syntax her. selbststartende threads. }
besser so
public static void main (String [] args ) { Server myServer = new Server(); Thread myServerThread = new Thread (myServer); myServerThread.start(); }
tut mir leid aber selbst startende threads find ich ... hammer giftflasche staubwoke totenkopf erhobenefäuste, .....
zu deinem problem hab ich keine ahnung. werd mich heut abend ggf mal kurtz drüberschauen.
gruss Termite
-
Hmm, ok hab das ja auch nur so aus dem Tutorial.
Danke für die Mühe....
-
Hi
ähm ja. das man dazu den debugger anschmeissen muss. ne ne ne. bin ich blind.
also
du prodozierst eine endlosschleife in deiner conection classe. nachdem die verbindung beendet wurde. kehrt in.readLine() sofrot mit null zurückt. und das natürlich in einer endloschleife. auserdem wird der thread nicht beendet. du hast da ne endlosschleife ohne ausgang.
while (true) // << Hir eine boolvariable verwenden wie z.B. run // sonst kommst du nicht aus der schleife raus { line = in.readLine(); // << nach beenden der connection wird hier immer null zurückgeliefert. if (line != null) { if (line.startsWith("{[USER]}")) { this.strName = line.substring( line.lastIndexOf("}") + 1, line.length()); server.say(this.strName + " hat sich connected."); } else if (line.equals(server.QUIT)) { server.removeConnection(this); server.say(this.strName + " hat sich disconnected."); // run auf false setzen, um die schleife zu beenden !! if (!this.isInterrupted()) // was du da testen willst versteh ich nicht. this.interrupt(); // vorallem da das das gleiche macht wie isInterupted // nur das er interrrupted zurücksetzt fals es true war. // laut sun docu 1.4.2 und meinen miesen englischkentnissen ;) } else { server.broadcast(line); } } }
weiter gibts glaub auch noch ein problem wenn sich 2 applets gleichzeitig connecten wollen. muss aber noch mal nachfolziehen.
gruss Termite
-
Hey super, da hatte ich wohl Scheuklappen auf den Augen. Das mit der Endlosschleife war die Ursache. Beim Client hatte ich es ja auch schon richtig gehabt.
Ich danke dir noch mal für deine Bemühungen....