C# Chat - User online/offline anzeigen

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
ich hätte da mal eine Frage zu der TcpClient Klasse in C#.

Es geht nämlich darum, dass ich ein Server Tool habe und eben ein Client Tool.
Der Client verbindet sich zum Server und man kann dann vom Server an die Verbundenen Clients die Nachrichten verschicken.

Hab da nur ein Problem. Das Verbinden und Verschicken klappt ja wunderbar, aber wenn der Client die Verbindung trennt, dann wird der nach wie vor in der Liste angezeigt, aber ich bekomms nicht rauß warum.

Wenn man beim Client die Verbindung mit: Tcpclient.Close() schließt, dann sollte doch beim Server "TcpClient.Connected" false ergeben oder nicht? Genau das tut es nämlich nicht.

Hier noch der Code vom Client zum schließen der Verbindung:
Code:
private void CloseConnection() {
	try {
		Sender.Close();
		Receiver.Close();
		server.Close();
	} catch (Exception) {
	}
}

Hier der Code vom Server zur Abfrage ob der Client verbunden ist:
Code:
private void RemoveUser() {
	while (true) {
		if (UserName.Count > 0) {
				foreach (string abc in UserName) {
					TcpClient offClient = (TcpClient)UserOnline[abc];
					if (offClient.Connected == false) {
						UserOnline.Remove(abc);
						UserName.Remove(abc);
						ListBoxRemove(abc);
					}
				}
		}
	}
}

Noch kurz zur Klärung...
Bei mir werden die Clientsverbindungen auf dem Server in ein Hashtable (UserOnline) gespeichert. Die Schlüssel zu den Verbindungen sind außerdem noch in der (UserName) einem HashSet<string> gespeichert.
 
Als theoretisch müsstest du doch nur bevor sich ein Client abmeldet dem Server eine "Ich geh jetzt offline ID:1" Nachricht schicken". Empfängt der Server diese Nachricht kannst du anhand von IDs oder sonstigem den User zuordnen und aus der Liste entfernen.
 
Das wäre natürlich auch ne Idee, aber ich hab gehofft das würde so auch gehen.
Was ist z.B. wenn das Client-Tool durch den Taskmanager beendet wird oder abstürzt etc.

Dann kann das Tool dem Server ja gar nicht mitteilen "Hey ich geh offline". Somit wird es weiterhin in der online Liste geführt obwohl er es schon lange nicht ist. Wenn ich dann auch noch an diesen User ne Nachricht verschicken will, dann kommt ne Fehlermeldung.

Kennt den keiner ne Möglichkeit Serverseitig herauszufinden ob der Client noch verbunden ist oder nicht?
 
Du kannst natürlich auch in einem bestimmten Intervall vom Server aus Nachrichten an die Clients schicken um zu gucken, ob diese Antworten. Somit kannst du dann fest stellen, ob ein Client offline ist. Das Ganze z.B. alle 5 Minuten. Ist unter Umständen aber sehr Ressourcen fressend...
 
Ja die Idee kam mir auch schon, aber eben genau das "Resourcen" war das Problem ^^
Wenn das Tool in einem Unternehmen mit 100 PCs eingesetzt wird, dann ist schon scheiße wenn die alle paar Minuten angepingt werden vom Server.

Irgendwo hab ich mal ein Tutorial gesehen wo genau meine Problematik angesprochen wurde, aber ich kann es patu nicht mehr finden =(

Da ging es auch um einen Chat Server und einen Chat Client und der Server hat sofort bemerkt wenn der Client aufeinmal weg war (ob durch beenden oder Absturz oder sonstiges).
 
Öhm...
Wird die Verbindung des Sockets unterbrochen, tritt eine Exception auf, die du so oder so zumindest im Try-Catch abfangen musst. Bei der Verbindungsinitialisierung kannst du auch ein entsprechendes Timeout festlegen.
Naja wie auch immer, im Catch-Block kannst du dann den Client austragen.
Verstehe daher auch gar nicht was die ganzen Umwege sollen?
 
Welche Umwege? Wieso Umwege? ^^

Danke übrigens für den Hinweis mit dem Catch-Block. Werd ich mal ausprobieren =)
 
Also bei mir klappt das ganze irgendwie immernoch nicht!!
Langsam bin ich echt am verzweifeln!!

Muss ich für jeden Client eigentlich nen eigenen Thread starten? Oder reicht doch einer für alle?
Es ist nämlich so...

Ich habe nen Server zu dem sich alle Clients verbinden, aber weder untereinander noch zum Server irgendwelche Nachrichten schicken können. Allein der Server kann anschließend zu den verbundenen Clients Messages verschicken!
Momentan hab ich das ganze so, dass der Server auf eingehende Verbindungen horcht und diese dann in ein Hashtable speichert. Beim versenden von Nachrichten liest er der Reihe nach die Clients aus dem Hashtable aus und schickt denen ne Message.
Wie ist es aber wenn ich auf eingehende Nachrichten von den Clients prüfen will? Und zwar von allen gleichzeitig und nicht nur jeweils einen Client der sich zuletzt verbunden hat??
Ergänzung ()

Thread kann geschlossen werden. Hab das Problem nach ewigem hin und her nun selber gelöst!!
 

Ähnliche Themen

Zurück
Oben