ConquestRelay server connecting game servers and clients via the cloud

ConquestRelay-Server jetzt auf GitHub

Wie bereits in meinem Beitrag vom August in Aussicht gestellt habe ich nun den Quellcode meines Relay-Servers aufgeräumt und eine erste Version unter dem Namen ConquestRelay bei GitHub hochgeladen. Er richtet sich vor allem an Hobbyspieleentwickler die schnell erste Prototypen ihrer Online-Spiele ausprobieren wollen. Entsprechend fehlen natürlich viele Features die professionelle Netzwerkschichten bieten.

Um mit dem ConquestRelay-Server erste eigene Versuche zu starten folge einfach diesem Link zu GitHub und lade Dir entweder das ganze Paket als Zip-File herunter oder klone das Projekt auf Deinen Desktop. Es enthält eine Kopie der Bibliothek websocket-sharp, ein Verzeichnis mit dem Relay-Server selbst und ein Beispielprojekt für Unity.

Wozu ist dieser Server nun eigentlich gut? Wie Du vielleicht schon in meinem früheren Beitrag dazu gelesen hast arbeite ich gerade an einem Online-Spiel dessen Server ich eigentlich auf einer Instanz in der Amazon-Cloud hosten wollte. Da ich aber keine Pro-Lizenz von Unity besitze kann ich den Server nicht „headless“ übersezten, d.h. ohne grafische Ausgabe im sog. „Batchmode“. Das wäre aber für einen solchen Cloud-Server notwendig, da diese keine Grafikkarten besitzen. Ich suchte daher nach einer Lösung wie ich das Spiel auf meinem eigenen Server zuhause hosten könnte während sich Rechner von überall her damit verbinden können, sogar Mobilgeräte. Die Lösung, für die ich mich entschied, waren WebSockets zusammen mit einem Relay-Server auf meiner Cloud-Instanz die den Spiel-Server mit den Spieler-Clients verbindet (s. Diagramm oben).

Starten des ConquestRelay-Servers

Solange Du Visual Studio benutzt (ich arbeite mit Visual Studio Community 2013) sollte das Bauen des Projekts einfach sein. Öffne einfach die Datei ConquestRelay.sln und kompiliere sowohl die Bibliothek websocket-sharp als auch den Relay-Server selbst. Da der Server nur auf eingehende Verbindungen von Spielservern und -clients wartet muss nichts konfiguriert werden. Im Moment lauscht er auf Port 443, der für Https-Verbindungen reserviert ist und daher in normalen Firewall-Konfigurationen offen sein sollte. Für einen ersten Test auf Deinem lokalen Rechner ist das allerdings nicht wichtig, also starte einfach die ConquestRelay.exe die Du gerade generiert hast.

Spiel-Client in Unity ausführen
Korrekte Konfiguration der Build Settings für den Spiel-Client mit Lobby.

Der Ordner Unity enthält ein Asset Package mit Beispielspielserver und -client. Nach dem Import dieses Pakets in Unity enthält das aktuelle Projekt drei neue Szenen, GameServer, GameClient und ClientLobby. Baue zunächst die Szene GameServer und starte sie als Windows-Applikation. Dann öffne die Szene ClientLobby. Setze, wie im Screenshot oben gezeigt, diese Szene als Szene 0 in den Build Settings, und GameClient als Szene 1. Nun starte die Szene im Editor. Du erhältst eine „Liste“ mit einem Spielserver der auf neue Spieler wartet. Benutze den Join-Button der eine Verbindung mit diesem Server herstellt und ein neues, leeres Player-Objekt instantiiert. Ab diesem Punkt bist Du gefragt. Wenn sich mehrere Clients mit dem Server verbinden wird für jeden ein Player-Objekt in jedem Client generiert. Nun wäre es an der Zeit eigenen Code zu den Player-Objekten hinzuzufügen.

Wo fange ich mit dem Programmieren an?

Die wichtigste Klasse für Dein Spiel im Unity-Projekt ist WebSocketBase. Sie verbindet sich mit dem ConquestRelay-Server und stellt Methoden für Remote Procedure Calls (RPCs) zur Verfügung. Sie verarbeitet die Systemnachrichten des Relay-Servers, überlässt die Kommunikation zwischen Spielserver und -clients aber abgeleiteten Klassen (WebSocketServer, WebSocketClient und WebSocketLobby). Die Methode ParseMessage() ist hier von zentraler Bedeutung.

RPCs werden als Strings übertragen, wobei Spielkommandos immer mit dem Präfix „Cmd“ beginnen, gefolgt von dem Kommandonamen und eventuellen Parametern und durch Leerzeichen getrennt. Die Methode ParseMessage() enthält nichts weiter als eine Reihe von Stringauswertungen die diese Nachrichten analysieren. Sobald Du hier ein Kommando hinzugefügt hast kannst Du es mittels RPC(), ServerRPC() oder BroadcastRPC() aufrufen.

ConquestRelay und die Cloud

Den ConquestRelay-Server auf Deiner eigenen Cloud-Instanz laufen zu lassen ist relativ einfach. Lade ihn zunächst hoch und starte ihn, danach musst Du noch sicherstellen dass Port 443 nicht von der Firewall geblockt wird. Das sollte eigentlich alles sein. Notiere Dir die IP-Adresse der Cloud-Instanz und trage sie an den entsprechenden Stellen der Awake()-Methoden von WebSocketServer, WebSocketClient und WebSocketLobby ein. Damit sollte sogar eine Verbindung mit Mobilgeräten funktionieren.

Reichlich offene Punkte

Wie ich vorher schon geschrieben habe ist der ConquestRelay-Server für mich nur ein Mittel um mein Spiel überhaupt zum Laufen zu bekommen, aber auch eine Übung um mich mit WebSockets vertraut zu machen. Natürlich bleibt damit noch eine Menge zu tun, die Software ist weit davon entfernt in einem ernsthaften Projekt einsetzbar zu sein. Hier ist nur eine Auswahl der offensichtlichsten Dinge die noch berücksichtigt werden müssen:

  • Binäre Übertragung anstatt String-basierter Nachrichten.
  • Irgendeine Art von Sicherheitsmechanismen, da im Moment jeder den Relay-Server verwenden kann sobald er die IP-Adresse der Cloud-Instanz herausfindet.
  • Berücksichtigung variabler IP-Adressen für den Fall dass die Cloud-Instanz neu gestartet wird.
  • Korrekte Behandlung von Disconnects und Reconnets.
  • Optimierung der Übertragungsgeschwindigkeit, wobei man beachten sollte dass ein solcher Relay-Server wahrscheinlich nie schnell genug für FPS- oder RTS-Spiele sein wird.
  • Dokumentation. 😉

Und so weiter. Wenn Du allerdings nur die ersten Schritte in der Online-Spieleentwicklung machen möchtest ohne bereits großes Geld zu investieren dann gib dem ConquestRelay-Server eine Chance. Ich würde mich auf jeden Fall freuen wenn ich helfen konnte.

Schreibe einen Kommentar