Du bist nicht angemeldet.

Werbeanzeige

1

13.07.2014, 01:06

Dedicated Java Server für Unity3D

Hallo.

Ich arbeite momentan an einem Multiplayer Survivalgame und möchte einen Dedicated Server basteln
Zurzeit läuft alles ziemlich gut, der Server empfängt byte arrays und sendet sie dann an jeden verbundenen spieler.

Aber ist das eine gute Idee? Sollte ich vorher die Packete erstmal irgendwie überprüfen? Oder reicht es wenn die Clients das machen (Wegen hackbarkeit etc).
Der Server soll später Voice, Bewegung und Interaktion übermitteln.

Java Server message Handler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (true)
{  
    try
    {  
        byte[] bytes = new byte[1000]; // Großer Buffer - Ist das eine gute möglichkeit?
        int count = streamIn.read(bytes); // Empfangen der Daten
        System.out.println(count);
        listener.SendMessage(bytes, count); // Senden der Daten an alle verbundenen sockets
    }
    catch(IOException ioe) 
    {  
        System.out.println(ioe.getMessage());
        break;
    }
}


Kann man das irgendwie besser machen?

LG

EDIT:
Kurz nochmal nachgedacht und selbst bemerkt das es KEINE gute idee ist.
Ich sollte besser Spielerklassen erstellen und den Server alles handeln lassen.
Heißt: Positionen speichern, Inventar, Objekte in der Welt und dann daraus testen ob Interaktionen möglich sind.

Dazu fällt mir jetzt grade nur ein eine Serialisierte Klasse zum Server zu senden, sie dort auswerten lassen und bei korrekten Daten änderungen vornehmen.
Wäre das besser? Oder hab ich grade denkfehler. (Ist ja schon spät :D)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SatyPardus« (13.07.2014, 01:22)


Stazer

Alter Hase

Beiträge: 470

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

2

13.07.2014, 03:26

http://www.gabrielgambetta.com/fpm1.html

Freundliche Grüße
Stazer

BlueCobold

Community-Fossil

Beiträge: 10 890

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

13.07.2014, 08:33

Generell ein sehr guter Link. Allerdings leidet sein Sample-Code leider ziemlich übel unter Rubber-Banding, selbst bei 25ms Verzögerung und 25 Updates pro Sekunde. Aber immerhin.

Allgemein sollte man immer im Kopf behalten: All incoming data is evil.
Ohne Validierung sollte der Server gar nichts weiterleiten. Zudem leitet er ja meist eigentlich nicht das weiter, was der Client schickt. Denn der Client schickt eine Anfrage. Die Antwort darauf wird zumeist nicht dieselben Daten beinhalten.

Die Validierung und korrekte Verarbeitung der Daten sehe ich hier auch erst mal als den kritischen Punkt und nicht irgendwelche Methoden zur virtuellen Latenz-Reduzierung. Letztere sind nämlich ziemlich Clientseitig und kein Server-Thema, was man unbedingt von Anfang an beachten müsste. Erst mal sollte es überhaupt laufen und Cheat-sicher sein. Sonst teleportieren sich plötzlich Spieler über die ganze Welt wie damals bei diversen WoW-Servern.
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]

4

13.07.2014, 10:51

Soo. Ausgeschlafen und etwas klarer im Kopf.

Ich habe gestern abend total den müll geschrieben. Habe mir das nochmal angesehen und naja.

Habe mir jetzt überlegt mit bytes zu arbeiten, die sagen welche Nachricht/Anfrage jetzt kommt. Jedoch weiß ich grade nicht wie ich das mit den Daten mache.
Da mein Server ja auf java basiert, wie kann ich dann zum beispiel eine Position senden und überprüfen?

Den link gucke ich mir gleich mal an. Vielleicht beantwortet er ja schon meine Frage.

BlueCobold

Community-Fossil

Beiträge: 10 890

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

13.07.2014, 10:54

Bist Du Dir sicher, dass Du Dich nicht vorher mal generell etwas mit Netzwerk und Streams beschäftigen willst (wahlweise mit dem Schlüsselwort "if"), bevor Du Dein Vorhaben beginnst?
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]

NachoMan

Community-Fossil

Beiträge: 3 909

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

13.07.2014, 11:11

Ich sollte besser Spielerklassen erstellen und den Server alles handeln lassen.

Dann musst du die ganze Logik des Spiels in Java und in C# bzw. Unityscript schreiben.
Wieso nimmst du für den Server nicht auch Mono?

Es gibt Assets im Assetstore, die dedicated Server ohne viel mehraufwand ermöglichen.
https://www.assetstore.unity3d.com/en/#!/content/1786
https://www.assetstore.unity3d.com/en/#!/content/6059
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

H5::

Treue Seele

Beiträge: 385

Wohnort: Kiel

  • Private Nachricht senden

7

13.07.2014, 11:47

Ich würde dir auch empfehlen (sofern du es nicht eh schon vorhattest) eine Messaging Bibliothek zu benutzen statt reiner Sockets. Da du mit Java arbeiten möchtest (falls noch aktuell) würde ich dir RabbitMQ statt ZeroMQ empfehlen (Die Java Bibliotheken von JeroMQ hinken etwas ZeroMQ hinterher und ansonsten muss man JNI einsetzen). Gibt aber auch noch andere.

Diese Bibliotheken bieten auch gute Tutorials an die dir helfen könnten etwas mehr Verständnis zu erlangen wie man etwas umsetzen kann.

Deine Nachrichten selbst kannst du dann in XML, JSON, YAML, msgpack, protobuff, usw… oder einem eigenen Format verschicken. Wobei ich XML, JSON und YAML eher meiden würde wegen dem Overhead zum Testen bieten sie sich aber auch gut an. Was ich nicht machen würde ist eine raw Serialisierung, da man so Probleme bei der Interkonnektivität bekommt.
:love: := Go;

8

13.07.2014, 12:21

Bist Du Dir sicher, dass Du Dich nicht vorher mal generell etwas mit Netzwerk und Streams beschäftigen willst (wahlweise mit dem Schlüsselwort "if"), bevor Du Dein Vorhaben beginnst?


Ich würde sagen das ich mich schon ziemlich gut auskenne was sowas angeht. Ist nicht das erste Netwerkprojekt an dem ich arbeite. Jedoch hatte ich bisher immer fertige Server welche ich nur ansprechen musste (Photon z.B. - Dort einfach ein RPC senden und empfangen).

Da mir diese sachen aber zu teuer sind (Für unbegrenzte Userzahl mal eben 3500 Euro) wollte ich es selbst schreiben.
Es funktioniert ja auch schon, nur ist die sicherheit halt zu 0% da, wenn mans einfach durchrutschen lässt.

Mono nehme ich nicht da der Server auf allen platformen laufen soll, ohne viel aufwand. Und mit java kennt sich heute schon jeder 12 Jährige aus.
Zudem bietet ein Java Server, welcher Open Source sein soll, viele möglichkeiten die es bei geschlossenen Servern nicht gibt. Modbarkeit ist das ein begriff.

Klar ich kenne die ganzen fachbegriffe nicht, ich mache das alles ja auch nur als Spaß und als Hobby, aber ich bin nicht so unerfahren. Ich denke die 6 Jahre die ich jetzt schon an sowas rumspiele bringen auch viel erfahrung mit.

@MachoMan: Ich gucke mir die Links mal an. Danke.

@H5:: Ich wollte Java zusammen mit Sockets nutzen weil ich in Unity mit C# arbeite und das sehr leicht zu verbinden ist. Ich weiß jetzt nicht ob die Bibliotheken genauso einfach sind, aber ich werde es mir auch mal angucken. Ebenfalls danke.

Habe mir die Seite von Stazer auch grade mal angesehen. Das ist sehr gut beschrieben und hilft mir auf jedenfall. Jedoch hätte ich dazu eine Frage.
Wenn ich nun einen Server schreibe, welcher auf die Inputs achtet die der Client sendet, der Server kriegt doch bestimmt nicht exakt die selben Positionen wie der Client, oder irre ich mich da? Sollte man da eine Tolleranz einbauen welche einfach Ignoriert wird?

Aber ich lese mich jetzt erstmal in die Sachen ein die ihr mir gegeben habt. Sobald ich was zusammengebaut habe melde ich mich nochmal.
Falls hier übrigens jemand gewillt ist mir zu helfen, via Teamspeak oder Skype, das wäre sehr schön. Finde man lernt schneller wenn man reden kann, den viele Fragen kann man (bzw. ich) kaum in Textform rausbringen, ohne wie ein blutiger Anfänger zu klingen (Wie ihr sicher schon gemerkt habt).

LG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SatyPardus« (13.07.2014, 12:32)


DeKugelschieber

Community-Fossil

Beiträge: 2 668

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

13.07.2014, 13:19

Ich hatte in die Richtung auch schon mal was angefangen.

Rein auf Sockets aufgebaut und mit eigenem Protokoll, wenn du so willst. Standardmäßig wurde die Klasse "Message" über das Netzwerk gesendet, die dann Informationen zur Anfrage enthielt (z.B. was als nächstes kommt, um welchen Typ es sich handelt, ob sie verteilt werden muss, ...). Zurückgesendet wurde dann nur was benötigt wurde.
Das gibt auch schon mal etwas Sicherheit, sobald die Nachricht einen Befehl enthielt der nicht gestattet war, oder sonst irgendwie nicht regel konform war, hat der Server sie verworfen.

Alles natürlich dank der Serialisierung in Java möglich. Das nächste mal würde ich aber glaube ich auch eine Bibliothek nehmen.

BlueCobold

Community-Fossil

Beiträge: 10 890

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

13.07.2014, 13:29

Ich würde sagen das ich mich schon ziemlich gut auskenne was sowas angeht. Ist nicht das erste Netwerkprojekt an dem ich arbeite.
Dann verstehe ich nicht, wo das Problem liegt Positionen zu senden und zu vergleichen!? Details?

Und mit java kennt sich heute schon jeder 12 Jährige aus.
Nope. Und selbst die paar, die Java mal in den Händen hatten, treffen auf das Problem dass können und können zwei verschiedene Dinge sind. Aber es gibt auch viele langjährige Unity-Entwickler, die glauben sie könnten programmieren.

Ich denke die 6 Jahre die ich jetzt schon an sowas rumspiele bringen auch viel erfahrung mit.
Siehe erste Frage.
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]

Werbeanzeige