Spieleserver für ein rundenbasiertes Brettspiel für Android / iOS
9
Ich programmiere gerade ein iPhone-Spiel und möchte einen Online-Mehrspielermodus erstellen. In Zukunft wird diese App auf Android-Geräte portiert, also habe ich mich gefragt, wie ich den Spieleserver erstellen soll.
Welche Sprache soll ich zuerst wählen? Wie kann ein Server in die Lage versetzt werden, sowohl mit in Objective-C als auch in Java geschriebenen Programmen zu kommunizieren?
Wie geht das dann effektiv? Ist es gut, wenn ich einen Socket nach Client öffne (es gibt 2)? Welche Informationen soll ich an den Server senden? an die Kunden?
Ich möchte hier keinen heiligen Krieg beginnen, aber die meisten Internetdienste (flickr, twitter, facebook usw.) haben SOAP zugunsten von RESTful webservices und JSON als serialisiertem Format eingestellt. Obwohl im Wesentlichen gleich, stützen sich REST-Services auf die URL- und http-Methode, um beispielsweise zu definieren, was getan werden soll
GET /articles - list all articles
POST /articles -add a new article
PUT /articles/123- update article 123withnew data
JSON - beschrieben in json.org - ist auch einfacher als XML und spart Ihnen möglicherweise einige Bytes pro Anforderung, obwohl es möglicherweise irrelevant ist. Nach dem vorherigen Beispiel wird ein Artikel in JSON-Notation folgendermaßen beschrieben:
{"id":123,"author":"Cyril","content":"Hello, this is an article","tags":["gamedev","webservices","multiplayer"]}
Da Sie rundenbasiert sind, können Sie sich auf HTTP-Sitzungen auf dem Server verlassen, um den Status beizubehalten. Sie müssen also keine dauerhafte Socket-Verbindung zum Server aufrechterhalten. Jede serverseitige Sprache unterstützt dies (PHP, Python, Java usw.).
Mit dieser Architektur können Sie auf transparente Weise horizontal skalieren (weitere Server hinzufügen).
Da Ihr Spiel rundenbasiert sein wird, sind Echtzeit-Updates nicht besonders wichtig. Der einfachste Weg, dies zu tun, ist die Verwendung eines bereits erstellten Servers, ich würde mit einem Webserver gehen. Jede Plattform, auf die es sich lohnt, Ihr Spiel zu portieren, sollte den Zugriff auf Webdienste auf einem Webserver erleichtern.
Um Updates nahezu in Echtzeit bereitzustellen, empfehle ich Ihnen, sich mit langen Abfragen zu befassen. Der Code unter diesem Link bietet die grundlegendste Implementierung für lange Abfragen von der Serverseite. Unter dem Strich führt der Server jedoch einen blockierenden Aufruf aus, sobald eine Anforderung an eine Ressource gestellt wurde, bis die angeforderten Daten verfügbar sind. Dann wiederholen Sie den Vorgang immer wieder.
In Bezug auf die Daten, die Sie zurücksenden sollten, behandeln Sie den Client immer als feindlich. Der Client sollte senden, was auch immer sein "Turn-State" ist, der Server validiert es und wenn alles ausgecheckt ist, sendet er den neuen "Game-State" zurück an alle verbundenen Clients.
- -
SOAP-Webdienste sind wahrscheinlich der beste Startpunkt ( Link ), sie sind einfach zu starten und die meisten Webframeworks bieten eine Methode, um sie verfügbar zu machen. Möglicherweise möchten Sie sich auch mit RESTful-Diensten befassen, diese überlassen jedoch in der Regel den Serialisierungsprozess etwas mehr dem Verbraucher.
Informationen zum Konsumieren von SOAP-Webdiensten unter Android finden Sie hier .
Hallo und danke für deine Antwort. Aber ich verstehe noch nicht, wie ich Daten an meinen Webservice senden soll? Wie serialisiere ich die Benutzereingaben (hier ein Zug in meinem 8 * 8-Brett, zB: Spieler 1 von [0,0] nach [1,1]) und wie serialisiere ich dann den Spielstatus?
Cyril
Überprüfen Sie die beiden Links, die ich hinzugefügt habe. Sie sollten Ihnen den Einstieg in SOAP-Webdienste erleichtern. Dies ist wahrscheinlich der einfachste Weg, um loszulegen.
Nate
Für Android und iOS sollten Sie keine langen Abfragen verwenden müssen. Mit Apple Push Notifications oder Google Cloud Messaging können Sie Daten vom Server auf Ihre Geräte übertragen.
Matt
2
Ich denke, die Verwendung von SOAP oder sogar HTTP ist übertrieben. Definieren Sie einfach Ihr eigenes Protokoll über Vanilla-TCP-Verbindungen. Interpretieren Sie beispielsweise jede als Befehl gesendete Textzeile. Definieren Sie, welche Befehle / Antworten der Client und der Server senden dürfen.
FICS funktioniert so und dient seit vielen Jahren Tausenden von Schachspielern. IRC funktioniert auch so (siehe RFC 1459).
HTTP bietet jedoch mehrere Vorteile: Es kann Proxys verwenden, es ist fast nie Firewall, es bietet nahezu transparente Verschlüsselung mit HTTPS, hat mehrere Authentifizierungsmethoden ...
Ich denke, die Verwendung von SOAP oder sogar HTTP ist übertrieben. Definieren Sie einfach Ihr eigenes Protokoll über Vanilla-TCP-Verbindungen. Interpretieren Sie beispielsweise jede als Befehl gesendete Textzeile. Definieren Sie, welche Befehle / Antworten der Client und der Server senden dürfen.
FICS funktioniert so und dient seit vielen Jahren Tausenden von Schachspielern. IRC funktioniert auch so (siehe RFC 1459).
quelle