Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

11.12.2013, 17:24

[Java] Gameserver Fragen

Hallo,

ich biete meiner Stufe (aktuelle 12 Leute) momentan an ein Übungsprojekt zu leiten (wir sind "Informatiker", bzw. werden es teilweise). Was für ein Spiel entwickelt wird wird in den nächsten Tagen festgelegt (kick off meeting), allerdings soll es höchstwahrscheinlich einen Multiplayer haben.
Da ich selbst noch nicht allzu oft mit Netzwerkprogrammierung zu tun hatte, und in Java sowieso schon mal nicht, wollte ich präventiv ein paar Fragen stellen.

Vorab: ich habe zwar im Projekt als Hauptaufgabe die Leitung, da allerdings alle anderen doch noch frisch in der Programmierung sind, werde ich wohl hier und da mitprogrammieren. Dazu zählt vor allem das bereitstellen einer einfach zu bedienenden Netzwerkanbindung. Somit stelle ich also den Basiscode des Projekts und schaue mir an was passiert und beantworte Fragen.
Als Basis soll das "Entity Component System", welches auch schon implementiert ist, genutzt werden. Dieses möchte ich daher auch für die Server/Client Kommunikation verwenden. Den Code dazu findet ihr unter src/base/ und ein Beispiel unter src/client/test/.

Der Code für meinen Testserver findet ihr unter /src/server/Server.java (main). Der kann aktuell nichts weiter als beliebig viele Clients akzeptieren und broadcastet "Chatnachrichten" an alle verbunden Clients (bereits über Internet mit zwei Personen getestet).

Überlegung 1:

Für Gameserver habe ich allgemein folgende Modelle im Kopf:

1. Clients senden ihren Status, Server verteilt
2. Clients senden Befehle (z.B. Tastatureingaben), Server kontrolliert mehr oder weniger alles und "erlaubt" oder "verbietet" die Befehle. Dementsprechend wird verteilt (z.B. prüft der Server dann Kollisionen)

Methode 2 wird wohl deutlich "Hacksicherer" sein. Allerdings stelle ich mir die Frage welche Version einfacher umzusetzen ist, da dies ja auch "nur" ein Übungsprojekt ist und somit so etwas unberücksichtigt bleiben darf.
Es wäre allerdings auch nice to have und ein gewisser Umfang sollte schon vorhanden sein.

Edit: Gut was hier einfacher ist ist eigentlich klar, nur was würdet ihr nehmen, wie viel Logik würdet ihr schätzen muss/sollte der Server dann übernehmen und wie würdet ihr das implementieren?

Überlegung 2:

Dann bin ich mir noch unsicher wie man prüft ob ein Client oder der Server noch erreichbar sind, also der Ping, und wie man Daten verteilt. Da das Entity Component System die Daten in Components speichert, wäre es evt. sinnvoll Komponenten die sich verändert haben zu senden und diese vorher mit der ID des Entities zu markieren, so dass der Client letzten Endes bei sich die Entities mit entsprechenden Komponenten updated. Laufen würde beim Client dann ein separater Thread (mit entsprechendem System) der diese Aktuallisierungen annimmt.
Kann ich direkt Objekte über die streams senden?

Nunja, ich hätte also eure Erfahrung und allgemeine Einschätzung zu meinen beiden Überlegungen.
Den Code für dieses Projekt findet ihr hier: https://github.com/DeKugelschieber/Game

Bitte keine Bemerkungen zur Doku, allgemeinen Vorgehensweise, Wiki, Git, aktueller Code oder Anfragen zur Teilnahme. Das ist alles offtopic und ich nehme zu diesen Dingen sehr gerne PNs an.
Wenn das ganze läuft (Zeitansatz liegt bei 2 Monaten) bekommt ihr auch eine schöne Projektvorstellung ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (11.12.2013, 23:26)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

12.12.2013, 08:03

Dann bin ich mir noch unsicher wie man prüft ob ein Client oder der Server noch erreichbar sind, also der Ping

TCP/IP hat einen eigenen keep alive Mechanismus, so dass du das gar nicht selber herausfinden musst. Wenn die Verbindung nicht mehr besteht, bemerkst du das an der Exception beim Empfangen/Senden (siehe Doku)


Kann ich direkt Objekte über die streams senden?

Über ObjectOutputStream kannst du einfach Objekte in einen byte stream wandeln der dann gesendet werden kann. Beim Empfangen dann natürlich entsprechend die andere Richtung mit ObjectInputStream.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

12.12.2013, 08:13

Überlegung 1.1 dürfte für Einsteiger schon NP-hart für's Verständnis sein ;)
Überlegung 1.2 wäre der richtige Weg bei ernsthaften Projekten.
Eine Kombination aus beidem mit Client-side-prediction wäre die Königsklasse.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

12.12.2013, 11:11

Vielen Dank Tobiking damit ist mir schon mal geholfen.

@Blue: was meinst du mit NP-hart?

Meine Idee sähe so aus:

Quellcode

1
2
3
4
class NetworkMessage{ // oder so
 public int entitiyID;
 public Component component;
}


In den entsprechenden Systemen dann nach dem Update einer Komponente diese in eine "NetworkMessage" packen und an das Sende-/Empfangsystem übergeben. Das Empfängersystem hält dann alle Entities und updated die Components mit hilfe der ID. Das sendet dann alles der Reihe nach kontinuierlich an den Server. Dieser sendet dann an die Spieler weiter und führt natürlich selbst noch Logik aus.

Welche Logik würdet ihr denn besser dem Server überlassen?
Ich denke spontan an:

- Kollisionstest (Spieler, Schüsse, alles was sich bewegt)
- Authentifizierung
- ...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

12.12.2013, 12:01

@Blue: was meinst du mit NP-hart?
Google mal danach.

Welche Logik würdet ihr denn besser dem Server überlassen?
Alles, was den Datenbestand nachhaltig verändert. Bewegung (move, run, sit), Kollisionen (hit-tests, blocking, path-finding), Erstellung und Zerstörung von Objekten (items, drops, doors, walls, mobs/npcs...), Änderung von Objekten (hitpoints, equipped gear, etc).
Irrelevant sind Dinge wie öffnet Dialog, schließt Dialog, bewegt Maus, gibt Text ein. Wichtig sind nur die eventuellen Folgen daraus -> klickt im Dialog auf "accept quest", klickt mit Maus auf NPC, sendet vollständige Formular/Chat-Daten - die müssen natürlich wieder vom Server validiert werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

12.12.2013, 16:28

Okay, also so wie ich mir das gedacht habe. Ich probier das dann mal aus :)

@LetsGo: Ja so in der Art habe ich mir das vorgestellt. Aber ich glaube ich werde es trotzdem selbst schreiben, ist ja ein Übungsprojekt ;) Und den Umfang brauche ich es sowieso nicht. Aber ich follow da mal.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

12.12.2013, 19:03

Ich erwähne auch gern nochmal den wichtigsten Satz im Zusammenhang mit Server-Entwicklung:
All incoming data is evil!
Verlass Dich nie auf das Format der Daten. Verlass Dich nie auf korrekten/sinnvollen Inhalt der Daten (z.B. "ich will -100.000.000 Pfeile kaufen, um einen Geld-Exploit zu nutzen") und verlass Dich nie darauf, dass die Requests auch nur annähernd sinnvoll in Bezug auf den Zustand des Spielers sind (z.B. Spieler versucht Skill für Level 99 beim NPC zu lernen, obwohl er nur Level 1 ist und dieses Menü nie sehen sollte - oder er meldet 30.000.000 erspielte Highscore Punkte für Level 5, obwohl nur maximal 1230 möglich sind).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

12.12.2013, 22:09

Ja das ist mir klar, entwickel ja schon länger Webseiten und Datenbanken ;)
Ich bin da recht zuversichtlich dass das was wird.

9

12.12.2013, 23:46

https://github.com/EsotericSoftware/kryonet/ ist zu empfehlen (ups hat LetsGo ja schon geschrieben ^^). Ich habe ansonsten gute Erfahrungen mit Netty gemacht. KryoNet ist aber wirklich zu empfehlen.

Schau Dir den Rest hier von mal an: http://playerio.com/documentation/tutori…torial/security

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chromanoid« (13.12.2013, 01:01)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

14.12.2013, 16:27

Edit Gut ich hatte da was falsch verstanden, hat sich erledigt.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »DeKugelschieber« (17.12.2013, 00:19)


Werbeanzeige