Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Überarbeitung Netzwerkspiel (https://www.delphipraxis.net/88060-ueberarbeitung-netzwerkspiel.html)

Antigo 9. Mär 2007 14:26


Überarbeitung Netzwerkspiel
 
Hi,
Ich habe zusammen mit ein paar Freunden ein Netzwerk Spiel geschrieben, was jetzt aber so verbuggt ist, dass wir es gerne noch einmal komplett neu entwickeln wollen. Knackpunkt ist hier jetzt erstmal die Kommunikation von Server und Clients. Bisher läuft das ganze so ab, das es einen Spielcounter gibt, anhand dessen Client und Server abgleichen können, ob es veränderungen gab.
Anfangs ist dieser Spielcounter 0 und bei jedem Zug, den ein Spieler ausführt wird er um eins erhöht.

Jeder Client fragt nun kontinuirlich nach ob es etwas neues gibt. Dazu schickt er seinen Spielcounter an den Server, dieser gleicht ihn mit dem aktuellen ab und schickt entweder zurück, dass es nichts neues gibt, oder aber die Veränderungen und den neuen Spielcounter.

Soweit das grundlegende Konzept, was auch funktioniert. Da wir das ganze bei der Neu entwicklung natürlich besser machen wollen, stellt sich hier die Frage, wie kann man den Overhead möglichst gering halten kann. 90% der Zeit wird nur sinnlos der Spielcounter geschickt und es kommt die Antwort das sich nichts getan hat. Es gibt bei dem Spiel halt sehr viel Freilauf, indem einfach nichts passiert (Vergleichbar mit Schach), trotzdem soll aber jeder Client so schnell wie möglich über Veränderungen informiert werden.
Es fehlt halt irgendwie die Möglichkeit vom Server aus Nachrichten an die Clients zu schicken.

Überlegt hatten wir jetzt schon, ob jeder Client auch einen ServerSocket aufmachen soll, damit der Server dann aktiv die Kommunikation anstoßen kann. Allerdings muss dann auf Client Seite auch eine Portfreigabe gegeben sein, was nicht so schön ist. Ausserdem muss der Server dann jede Menge Sockets und dementsprechend viele Ports verwalten. Auch sehr unschön.

Bisher hatten wir das ganze mit TClientsocket und TServerSocket gelöst. Hier haben wir dann per SendText die Informationen übermittelt.


Habt ihr vielleicht Tipps wie sich soetwas am effizientesten Lösen lässt? Ich bin mir sicher das diese Problemstellung öfters schon aufgetreten ist, ich konnte aber leider nichts passend finden. Sry dafür.


vielen dank aber auf jeden Fall schonmal :)

mfg
Antigo

Antigo 10. Mär 2007 15:07

Re: Überarbeitung Netzwerkspiel
 
niemand einen tipp? *push*

Helmi 10. Mär 2007 15:21

Re: Überarbeitung Netzwerkspiel
 
Hallo,

mal ne frage vorweg: Wieso sendet der Server nicht einfach an die Clients wenn sich was geändert hat?
So fragen die clients nicht ständig den Server ob sich was geändert hat

Nuclear-Ping 10. Mär 2007 15:26

Re: Überarbeitung Netzwerkspiel
 
Zitat:

Überlegt hatten wir jetzt schon, ob jeder Client auch einen ServerSocket aufmachen soll, damit der Server dann aktiv die Kommunikation anstoßen kann. Allerdings muss dann auf Client Seite auch eine Portfreigabe gegeben sein, was nicht so schön ist. Ausserdem muss der Server dann jede Menge Sockets und dementsprechend viele Ports verwalten. Auch sehr unschön.
Was anderes wird dir glaube aber kaum übrig bleiben, wenn du über TCP arbeitest. Anders gänge es mit UDP, da es ein verbindungsloses Protokoll ist. Wie ist es damit?

Antigo 10. Mär 2007 15:49

Re: Überarbeitung Netzwerkspiel
 
Zitat:

Zitat von Helmi
Hallo,

mal ne frage vorweg: Wieso sendet der Server nicht einfach an die Clients wenn sich was geändert hat?
So fragen die clients nicht ständig den Server ob sich was geändert hat

wie soll das gehen? Der Server kann meines Wissens doch nur antworten, nicht aber von sich aus etwas schicken?!
Zitat:

Zitat von Nuclear-Ping
Zitat:

Überlegt hatten wir jetzt schon, ob jeder Client auch einen ServerSocket aufmachen soll, damit der Server dann aktiv die Kommunikation anstoßen kann. Allerdings muss dann auf Client Seite auch eine Portfreigabe gegeben sein, was nicht so schön ist. Ausserdem muss der Server dann jede Menge Sockets und dementsprechend viele Ports verwalten. Auch sehr unschön.
Was anderes wird dir glaube aber kaum übrig bleiben, wenn du über TCP arbeitest. Anders gänge es mit UDP, da es ein verbindungsloses Protokoll ist. Wie ist es damit?

An UDP hatte ich noch nicht gedacht. Ist das aber nicht eigtnlich veraltet?

Wie machen andere Netzwerkspiele das ganze denn?


PS: Danke für die Antworten ;)

Helmi 10. Mär 2007 16:49

Re: Überarbeitung Netzwerkspiel
 
Hallo,

der ServerSocket kann so z. B. senden:
Delphi-Quellcode:
ServerSocket.Socket.Connections[Client].SendText(Text);

Antigo 10. Mär 2007 16:54

Re: Überarbeitung Netzwerkspiel
 
@Helmi, das geht tatsächlich, habs grad getestet :shock:
wenn wir das vorher gewusst hätten hätten wir uns eine Menge Arbeit sparen können... naja egal ^^

Gibt es zu dem ganzen ActiveConnections Kram ein vernünftiges Tutorial? Das ist mir noch nicht ganz geheuer.

inherited 10. Mär 2007 17:25

Re: Überarbeitung Netzwerkspiel
 
Zitat:

Zitat von Antigo
An UDP hatte ich noch nicht gedacht. Ist das aber nicht eigtnlich veraltet?

Wie machen andere Netzwerkspiele das ganze denn?

UDP ist nicht veraltet, TCP baut auf UDP auf. Nur beim TCP-Protokoll wird überprüft, ob auch das Gesendete ankommt. Bei simplen UDP *kann* es unter "umständen" zu dem unwahrscheinlichen Fall kommen, dass ein Paket verloren geht.

Corpsman 10. Mär 2007 17:39

Re: Überarbeitung Netzwerkspiel
 
So unwahrscheinlich ist das aber nicht.

wenn du auf ner Lan bist wo ettliche leutchen Zocken. da ist so viel raffic im netz da geht das udp zeug andauernd verloren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz