Hallo zusammen,
ich hoffe ihr könnt mir helfen. Ich habe 3in Chatprogramm, welches mehrere Clients mit dem Server verbindet.
Meine Aufgabe ist es nun, aus der erstellten LinkedList (welche alle aktiven Clients verwaltet) die Clients zu löschen, welche NICHT MEHR MIT DEM Server verbunden sind.
Ich bekomm es einfach nicht hin, habe hier im Forum schon eine Methode gefunden, aber damit klappts nicht so recht! Wo soll ich die Methode aufrufen!?
Steh sowas von auf dem Schlauch, schon seit 4 Tagen bin ich an diesem Problem
Die Methode:
this.toRemove = toRemove;
//Schleife durch die Liste um den Namen herauszufiltern
for (int i=0; i<threadList.size(); i++) {
clientThread = threadList.get(i);
String name = clientThread.getThreadName();
//Prompt zum Test...
System.out.println("Remove-Schleife: Durchgang "+i+": toRemove: "+toRemove+", Name in Liste: "+name);
if (name == toRemove){
//Eintrag entfernen
threadList.remove(i);
System.out.println("Thread \""+toRemove+"\" erfolgreich entfernt!");
}
}
}
/**
* Diese Methode sorgt für eine Sendung des Streams an alle beteiligten
* Chatteilnehmer. Dazu wird die erstellte Linkliste befragt.
*
* @param output
*/
pu```
Meine Klasse:
``` package lektion5.copy;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Iterator;
import java.util.LinkedList;
public class ChatServer extends Thread{
private Socket clientSocket;
private ServerSocket serverSocket;
private static int port = 4444;
protected LinkedList<ClientThread> threadList = new LinkedList<ClientThread>();//Client Liste
private Iterator<ClientThread> iterator;
private ClientThread clientThread;
private Thread thread;
private String toRemove;
/**
*
* @param args Portangabe über den User beim Start des Servers
*/
public static void main(String[] args) {
if (args.length == 1) {
try {
port = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
System.out.println("Ungültige Port-Angabe! "+nfe.toString());
}
}
ChatServer server = new ChatServer();
server.start();
StringBuffer sb;
char c;
String ausgabe;
while(true) {
sb = new StringBuffer();
try {
Reader in = new InputStreamReader(System.in);
while((c=(char)in.read()) != '\r') {
sb.append(c);
}
} catch (IOException ioe) {
System.out.println(ioe.toString());
}
ausgabe = sb.toString();
if (ausgabe.equals ("exit")) {
server.closeAll();
} else {
System.out.println("\""+ausgabe+"\" wird nicht ausgewertet");
}
}//ENDE Main
}
/**
* @override run() durch main der Klasse ChatServer:
*
* Aufruf der run()-Methode automatisch über server.start();
* Als erstes bekommt der Server einen Port zugewiesen, der sodann
* von ihm überwacht wird. Nach dem Anlegen einer Thread (Client) Liste
* Wartet der Server mit dem Einstieg in die while-Schleife auf
* Anmeldung eines neuen Clients und bestätigt diese Verbindung
* dann mit einem Promt und der Ausgabe der Teilnehmer im Chat.
*/
public void run() {
try {
serverSocket = new ServerSocket(port);
System.out.println("SERVER online und überwacht Port: "+port);
} catch (IOException ioe) {
System.out.println("ServerSocket-Fehler: "+ioe.toString());
}
threadList = new LinkedList<ClientThread>();//Clientliste anlegen
try {
//Bedingung: Anmeldung eines Clients
while ((clientSocket = serverSocket.accept()) != null) {
System.out.println("Verbindung zu Socket "
+ clientSocket.getRemoteSocketAddress()
+ " aufgenommen");
clientThread = new ClientThread(clientSocket, this);
thread = new Thread(clientThread, clientThread.getThreadName());
System.out.println("Thread: "+thread);
System.out.println("Name: "+clientThread.getThreadName());
threadList.add(clientThread);//Client in die Liste zufügen
thread.start();
//Liste aktiver Teilnehmer an alle versenden
//siehe JAV06N, Einsendeaufgabe Nr.:6
generateOutput(createClientNamesString());
}
} catch (IOException ioe) {
System.out.println(ioe.toString());
}
}
/**
* Einsendeaufgabe Nr.5: Sorgen Sie dafür, dass der Server einen Client
* nicht mehr mit Meldungen versorgt, wenn sich dieser abgemeldet hat.
*
* Idee: Die ThreadListe wird über eine for-Schleife nach dem passenden
* Eintrag durchsucht. Bei einer Übereinstimmung wird durch .remove(Object)
* der zu schließenden ClientThread aus der Liste entfernt.
*
* @see java.util.LinkedList.remove(Object o)
*/
public void removeDisconnectedClient(String toRemove) {
this.toRemove = toRemove;
//Schleife durch die Liste um den Namen herauszufiltern
for (int i=0; i<threadList.size(); i++) {
clientThread = threadList.get(i);
String name = clientThread.getThreadName();
//Prompt zum Test...
System.out.println("Remove-Schleife: Durchgang "+i+": toRemove: "+toRemove+", Name in Liste: "+name);
if (name == toRemove){
//Eintrag entfernen
threadList.remove(i);
System.out.println("Thread \""+toRemove+"\" erfolgreich entfernt!");
}
}
}
/**
* Diese Methode sorgt für eine Sendung des Streams an alle beteiligten
* Chatteilnehmer. Dazu wird die erstellte Linkliste befragt.
*
* @param output
*/
public synchronized void generateOutput(String output) {
iterator = threadList.iterator();
while(iterator.hasNext()) {
ClientThread thread = iterator.next();
thread.output(output);
}
}
/**
* Einsendeaufgabe Nr.6: Ergänzen Sie die Applikation, sodass jedem
* neuen angemeldetem Besucher alle bereits im Chat angemeldeten
* Teilnehmer in der Begrüßungsmitteilung des Servers aufgelistet
* werden
*
* Idee: Threadliste per Schleife abfragen und im String speichern.
* Bei der Abfrage der ThreadList.size() muss beachtet werden das
* der "abfragende" Teilnehmer bereits einen Eintrag in der Liste
* darstellt!
*
* @return String aller Client-Threads (Chatteilnehmer) an Output
*/
private String createClientNamesString()
{
if (threadList.size() == 1)//Da ein "Abfrager" online
{
return "Kein User online :-(";
}
String result = "Gerade online: ";
for (int i=0; i<threadList.size(); i++){
ClientThread clientThread = threadList.get(i);
String name = clientThread.getThreadName();
result += name;
if (i < threadList.size()-1){
result += ", ";
}
}
return result;
}
/**
*
*/
private void closeAll() {
//die Streams werden in den ClientThread-Objekten geschlossen
try {
serverSocket.close();
System.exit(0);
} catch (IOException e) {
System.out.println(e.toString());
}
}
}