C# Client - Server Struktur (Anfänge)

Kantholy

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
323
Nabend Leute,

ich hab jetzt schon so einiges mit C# gemacht, sowohl Konsolen als auch WinForms technisch, und jetzt würd ich gern einen Schritt weiter gehen und eine Client-Server Applikation basteln wollen, allerdings hab ich keine Ahnung wie das funktionieren soll...

Okay, was ich könnte wäre wieder den Zwischenschritt über einen Apache Server mit MySQL/PHP Backend und halt einfach einen HTTP GET/POST, allerdings will ich das nicht sondern ich will mir quasi 2 Programme schreiben - eine Serverapplikation und eine die die Rolle des Clients übernimmt und dann zum Bleistift einen total billigen Chat zusammenbasteln...

Nur, wie funktioniert das ganze? Theoretisch könnte ich mir das schon vorstellen...
Ein "Server"-programm, dass einfach einen bestimmten Port abhört (da gehts schon los, keine Ahnung wie das gehen soll) und eben Befehle entgegen nimmt... z.B. einen Push und einen Pullbefehl. Dazu dann dementsprechend den Client der in einem bestimmten Intervall einfach immer abfragt ob es was neues gibt bzw. eben Daten in Richtung Server sendet...

Was jetzt aber viel interessanter wäre, wenn der Server von Client A neue Daten bekommt und dann eben automatisch diese zu Client B,C,...,X schickt....


Könnt ihr mir da vielleicht helfen? Und seien es nur irgentwelche interessanten Nachschlagewerke - ich weiß nämlich nicht mal nach was ich googlen soll...
 
okay, das Tutorial hab ich durch, allerdings wird da ja nur erklärt wie das mit den Sockets generell funktioniert.
Und da läuft das so ab, ja dieser Socket eine Verbindung zum Server aufbaut, Daten sendet, dann die Rückgabedaten erhält und danach wird die Verbindung wieder getrennt...


wie läuft das jetzt aber, wenn ich quasi eine Verbindung erhalten will?

Stellen wir uns vor ich möchte einen primitiven Gameserver basteln, der hat eine maximale Anzahl an "Slots" also Connections frei und die ganzen Clients können sich darauf verbinden - die Verbindung muss dann ja aber irgentwie aufrecht erhalten werden ohne das irgentwas gesendet wird... Wie kann man sowas realisieren?

Oder gehen wir mal vom Gameserver weg und sagen: ein primitiver Chat, IRC like - mit dem Unterschied, dass beim ersten Tastendruck dieser Buchstabe an den Server übermittelt wird und die anderen die auch mit in diesem Chat sind sehen zur selben Zeit (naja annäherungsweise aufgrund der Latenz zwischen Client-Server/Server-ClientX) diesen Buchstaben dann...

Also muss ich ja quasi die Verbindungen aufrecht erhalten und sobald ein neuer Buchstabe von ClientA zum Server kommt, diesen auf ClientB/C/X verteilen...

Das wird in diesem Tutorial leider nicht abgehandelt wie das funktioniert...

Was auch eine interessante Frage ist: Wie wird das "professionell" gehandhabt? Schickt der Server dann cen Clients B/C/X diesen neuen Byte zu oder holen sich die Clients in einem bestimmten Intervall diesen ab (mit hilfe eines timestamps oder ähnlichem) - gibts da bestpractice Lösungen oder sowas?

Oder allgemein: Gibts Lektüre zu diesem Thema? Ich würd mich damit gern etwas genauer befassen...
 
Hallo Kant-holz,

ich denke das für jeden "Slot" dann eine Server Instanz erstellt wird, und wenn sich einer
Abmeldet, wird der Server des Slots geschlossen und die Ressourcen wieder freigegeben,
damit andere Verbinden können.

Was auch eine interessante Frage ist: Wie wird das "professionell" gehandhabt? Schickt der Server dann cen Clients B/C/X diesen neuen Byte zu oder holen sich die Clients in einem bestimmten Intervall diesen ab (mit hilfe eines timestamps oder ähnlichem) - gibts da bestpractice Lösungen oder sowas?
Da informiert der Server die Clients. Wenn die Clients in einem Zeitabstand die Anfrage
starten nennt man das Polling( soweit ich weiss). Dies wäre aber ein viel zu größer
Rechenaufwand. In diesem Stiel wurde früher Programmiert als es noch keine Events gab.
Mit Events kann der Server die Clients informieren wenn was passiert ist, und schon die
neuen Daten senden.

Grüße

krizzel
 
okay eine neue Serverinstanz is dann im dem Fall einfach ein neuer Thread, seh ich das richtig?

Okay, ich könnt mir vorstellen dass dann ein Server mit ~100 Leuten noch einigermaßen läuft, aber wie siehts aus wenn das mal mehrere Hundert oder gar an die 1000 User kratzt? Wird dass dann nicht irgentwann etwas instabil?

Oder hat dann ein Thread einfach mehrere Slots die hintereinander abgearbeitet werden?
 
Kant-holz schrieb:
okay, das Tutorial hab ich durch, allerdings wird da ja nur erklärt wie das mit den Sockets generell funktioniert.

Nö, auf Seite 4 wird erklärt wie man mit Sockets und Threads arbeitet, was Polling ist und was asynchrone Sockets sind.

http://www.codeplanet.eu/tutorials/6-csharp/4-tcp-ip-socket-programmierung-in-csharp.html?start=3

Ich zitiere:

Threads ermöglichen Multitasking innerhalb der Anwendung. Konkret gesagt ist das die Fähigkeit mehrere Dinge im Programm gleichzeitig zu machen. Sie können mithilfe von Threads einen Echo-Server schreiben der jeden Clienten in einem seperaten Thread verwaltet. Ein einfaches Beispiel das sich Threads zu Nutze macht finden Sie im Dateianhang.

Weiter heißt es dort:

Deshalb können Sie dieses gesamte Prozedere auch mithilfe der .NET ThreadPool Klasse realisieren.
 
okay, ich hab jetzt nochmal bissl weiter mit rumgespielt, aber irgentwie check ichs immer noch nicht so wirklich...

ich initialisiere meinen Server dass der das hören anfängt:

Code:
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, 1324));
server.Listen(10); //max queue = 10

und jetzt quasi will ich, dass wenn sich ein Client mit dem Server verbindet, dass dann ein Thread gestartet wird, und dieser Thread ist dann quasi an diesen Benutzer gebunden, bis dieser die Verbindung wieder trennt...

so, laut diesem Tutorial läuft der Server ja quasi einfach in einer Endlosschleife in dieser steht:

Code:
client = server.Accept();
#region
...
#endregion
client.Close();


so, wie bekomm ich jetzt wenn sich einer zum Server verbindet, dieses Teil in einen Thread ausgelagert?

Ich dachte da spontan an Eventhandler so nach dem Motte: onConnect, onDisconnect, etc.


nur wie funktioniert das?

Könnte mir dazu jemand ein Codebeispiel geben?
 
Zurück
Oben