Laden...

Mulit-Client TcpListener

Erstellt von JoE vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.687 Views
JoE Themenstarter:in
11 Beiträge seit 2004
vor 18 Jahren
Mulit-Client TcpListener

hallo ... hab da ein kleines problem und würde mich über jede art von hilfestellung freuen.

ich habe eine server-anwendung und selbstverständlich eine dazugehörige client-anwendung. das ganze realisiere ich über tcplistener und tcpclient. nun versuche ich den server mulit-client fähig zu machen, sprich dass mehrere clients gleichzeitig verbunden sein können, komme da aber irgendwie auf keinen grünen zweig.

mfg JoE

F
529 Beiträge seit 2003
vor 18 Jahren

Du musst einen Tcp-Listener Starten. Der wartet dann auf neuen Verbindungen. Wenn dann eine neue Verbindung hergestellt wird, erzeugst du einen neuen Thread der das Socket-Objekt(Oder TCP-Client-Objekt) verwaltet.

Aber warscheinlich weißt du das auch schon. Daher würde ich dich bitten, die Frage zu konkretisieren.

Besuchen sie das VisualC++ - Forum

JoE Themenstarter:in
11 Beiträge seit 2004
vor 18 Jahren
danke

okay, dankeschön ... soweit bin ich mittlerweile schon

wenn eine verbindung eingeht wird ein neuer thread eröffnet und die ganze kommunikation usw funktioniert dann auch ganz gut ... nun habe ich nur noch das problem dass wenn eine verbindung abgebrochen wird, die verbindungen der anderen threads auch nicht mehr funktionieren ... hat vl jemand eine idee wie man das verhindern kann?

hier mal mein sourcecode:


		void run()
		{
			long realid = connectid; // id des threads
			clientdata cd = (clientdata)dataholder[realid]; // daten des threads und des tcpclients
			
			while(true)
			{
				try
				{
					Stream stream = cd.structclient.GetStream();
					StreamReader reader = new StreamReader(stream);
				
					string data = reader.ReadLine();
					list.Items.Add(data);
				}
				catch
				{
					break;
				}
			}
			
			cd.structthread.Abort();
		}

danke im voraus

F
529 Beiträge seit 2003
vor 18 Jahren

Ich hätte gerne noch den Code der cd.StructThread.Abort()-Methoden gesehen.

Was mir an dem Code missfällt ist, dass dort zum Beispiel immer wenn was empfangen werden soll, du dir den Stream neu greifst. Hierbei wird, denke ich, aber nicht das Problem liegen.

Ich habe immer eine Client-Klasse geschrieben, welche die Verbindung zum Clienten/Server kapselt. Dieser kann man im Konstruktor den Socket mit der Verbindung zum Clienten übergeben. Diese Instanz wird dann von der Serverklasse, die auch auf neue Verbindungen wartet, in einer Liste gespeichert. Weiterhin stellt die Klasse Client zwei Methoden zum Senden und Empfangen bereit. Das Empfangen ist aber keine öffentliche Methode, da ich immer wenn Daten empfangen werden, einen Event auslöse, der von der übergeordneten Severklasse ausgewertet wird. Wenn die Verbindung zusammenbricht, oder eine SocketException in der Client-Klasse fliegt, versuche ich den Socket zu schließen, und löse dann einen Exit-Event aus. Dieser wird auch von der Server-Klasse abgefangen und daraufhin wird der Client aus der Liste der Verbindungen geworfen. Weiterhin existieren Mechanismen um auch Timeouts von Clientseiten zu erkennen. Also wenn der Client zum Beispiel mal zwei Minuten nichts geschickt hat, wird ihm auch die Verbindung getrennt.

Besuchen sie das VisualC++ - Forum