Seite 1 von 1

Server - Client Kommunikation

Verfasst: 26.06.2008 10:08
von Bisonte
Ich versuche mich gerade an einem Server-Client Programm...

Ein Client soll sich mit dem Server verbinden.

1. Der Client sendet also ein Login String und wartet auf Antwort.
2. Der Server empfängt den Login String und verarbeitet die Daten.
3. Der Server schickt eine Antwort.
4. Der Client empfängt die Antwort.

Dazu hab ich Fragen ...

Gibt es da zwischen Punkt 1 und Punkt 4 einen Timeout ?
Oder kann sich der Server alle Zeit der Welt leisten bis er die Anwort schickt ?

Wenn mehrere Clients sich verbinden, liegen nun mehrere Logindaten vor.
Existiert soetwas wie ein Queue bei dem ServerEvent und/oder RecieveNetwork, damit ich alles schön der Reihe nach abarbeiten kann ?
Oder muesste ich jetzt den Client solange den Login String senden lassen,
bis der Server endlich die passende Antwort geschickt hat ?

Und dann noch : Wenn der Client eine Weile keine Daten Sendet oder empfängt, schliesst sich die Verbindung irgendwann automatisch, oder
ist die Verbindung erst mit dem CloseNetwork geschlossen ?
(Ich habe das bei MySQL DB's bemerkt, das man da öfters prüfen muss, da der Server einen nach einer Weile die Verbindung kappt, wenn keine Aktionen durchgeführt wurden.)

Verfasst: 26.06.2008 10:33
von gnasen
Zwischen Punkt 1 und 4 sollte es nur einen Timeout geben, wenn du diesen selber programmierst. Ob sich die Verbindung automatisch schließt, kann ich nicht genau sagen. Ich denke es wird ein Timeout geben, dieses wird aber wahrscheinlich großzügig sein.
Ich handhabe es so, alle paar Sekunden einen Ping zu schicken und somit die Kontakte des Servers aktuell zu halten. Soll zB jede Sekunde ein Ping geschickt werden, und es kommt 10 Sekunden keine Antwort, gibts einen von mir erstellten Timeout.

Du arbeitest ja alle Networkevents ab. Diese sind nach den ClientIDs sortiert. Sprich:
-Prüfen ob ein Event auftritt
-Client feststellen
-Event auswerten (ReceiveNetworkData)

Sollten 5 Clients gleichzeitig etwas schicken, wird halt 5 mal ein Networkevent ausgelöst.

Jede Nachricht braucht (bei TCP) nur einmal gesendet werden. Der Server wirds nach belieben auswerten können.

Am einfachsten (finde ich) ist es, eine LinkedList zB mit der Struktur:
ClientID
Text
Zeitpunkt

zu erstellen und einfach beim Empfangen per Addelement() dieses hinzu zufügen. Irgendwo arbeitest du diese Liste dann ab.

Verfasst: 26.06.2008 10:56
von Bisonte
Dank erstmal... gleich ausprobieren ;)

Verfasst: 26.06.2008 14:54
von PMV
Es gibt keinen Timeout, ganz im gegenteil. Wenn der Server
CloseNetworkConnection() aufruft, wird dem entsprechenden Client keine
Nachricht geschickt. Dieser kann also immer noch munter weiter Daten
schicken, er wird nur keine Antwort mehr bekommen.

Macht der Client das allerdings, wird der Server benachrichtigt.

MFG PMV

Verfasst: 26.06.2008 17:38
von Bisonte
Also ganz brav vor dem CloseNetworkConnection() an jeden Client ein Logoff schicken...

Sowas hab ich mir dann fast gedacht...

Na dann bin ich mal auf den Stresstest gefasst ;)
Ohne Threads mit ca. 50 Clients gleichzeitig...

Mal sehen ob das funktioniert, es geht bei der Kommunikation auch nur um bytehappen... soll dem Anticheating dienen ähnlich wie Punkbuster.

Verfasst: 26.06.2008 20:30
von gnasen
Sollte kein Problem sein. Ich empfehle dir aber, die Netzwerksachen in einen Thread auszulagern, damit das Senden und Empfangen von vielen Daten nicht so sehr auf die Hauptschleife drückt.

Verfasst: 26.06.2008 20:47
von Bisonte
Naja ich scheue mich ein wenig davor... weil ich damit noch nie wirklich was gemacht habe...
und wenn ich mir die ganzen Threads im Forum hier anschaue, scheint das eine ganz bösartige schwierige Sache zu sein: diese Threadprogrammierung.

Ausserdem hab ich eine menge LinkLists da drin, daher hab ich ein kleinen Bammel davor, dass mir das alles unerwartet durcheinanderwirbelt... das wäre uncool... ;)