Wo fange ich mit der Codierung von Online-Bestenlisten an?

7

Ich habe NIEMALS Netzwerkcode in C ++ erstellt, ich kenne nicht einmal die vorhandenen Bibliotheken, aber eine beliebte Nachfrage nach meinem Spiel sind Online-Bestenlisten ...

Also, welche Art von Bibliotheken sollte ich erforschen?

Mein Spiel ist Multiplattform (Win, Gnu, Mac), verwendet C ++, ClanLib 1.0 und Lua. Auch die Engine ist zlib (so dass proprietäre Sachen, die ich nicht veröffentlichen kann, nicht funktionieren)

Speeder
quelle
3
Meine erste Empfehlung wäre "Verwenden Sie C ++ nicht für einen Leaderboard-Server". Implementieren Sie es in einer höheren Sprache, die normalerweise Funktionen für Handshakes, Sitzungen und dergleichen bietet. Die meisten von ihnen ermöglichen die Kommunikation über SOAP, was in C ++ problemlos unterstützt wird, sodass Ihr Client damit den Server kontaktieren kann. Persönlich erstelle ich mein generisches Leaderboard-System in .NET WCF (C #).
Elideb

Antworten:

6

Erste Frage, wie sehr interessiert dich Betrug? Das Erstellen einer einfachen Webanwendung für Bestenlisten ist wahrscheinlich ziemlich einfach, wird jedoch sofort aus dem Leben gerissen. Ich würde Curl als eine anständige asynchrone HTTP-Bibliothek betrachten, die Sie in nahezu jeden Client-Code integrieren können sollten. Für die Serverseite gehe ich davon aus, dass Sie kein Budget für dedizierte Server haben. Daher passt Google App Engine möglicherweise gut, wenn Sie Python oder Java kennen.

Codierer
quelle
Ich benutze zum zweiten Mal Google App Engine. Selbst wenn Ihr Spiel sehr beliebt wird, sollten Sie es dennoch problemlos in die kostenlose Stufe einpassen können. Es ist auch ein RIESIGES Plus, sich keine Sorgen um die Serverplattform machen zu müssen.
drxzcl
Das Problem ist, dass das Spiel selbst keine Ahnung hat, wie man Betrug verhindert ... Ich meine, es ist wahrscheinlich ein bisschen einfach, Cheat Omatic auszuführen (nach dieser Software zu suchen, es ist ziemlich cool) und die Partituren oder andere zu bearbeiten andere Nummer im Speicher (tatsächlich könnte ich damit sogar mehr Einheiten erstellen, als normalerweise in Age of Empires erlaubt sind).
Speeder
Gibt es so etwas wie eine Google App Engine, die weder Python noch Java verwendet? Ich kenne Unmengen von Sprachen, aber nicht diese beiden: /
Speeder
Nicht das ist kostenlos. Es gibt Heroku, wenn Sie Ruby / Rails kennen, und ich habe gehört, dass es nicht zu teuer ist. Um Betrug zu verhindern, müsste ich viel mehr über das Spiel wissen. PunkBuster und Valves Anticheat sind möglicherweise Optionen für die Client-Härtung, aber Sie benötigen eine serverbasierte Lösung, wenn Sie wirklich sicher sein möchten. Alternativ können Einträge in den Bestenlisten nach etwa einer Woche veraltet sein. Die meisten Spammer verlieren das Interesse.
Coderanger
3

Alles beginnt mit dem Protokolldesign. Was müssen Sie über das Kabel übertragen? Welche Art von Handshakes und Verifizierungsmechanismen werden benötigt? Es kann so einfach sein, dass jedes Mal, wenn ein Spiel vorbei ist, ein Netzwerkpaket gesendet wird. Es würde zum Beispiel einfach den Benutzernamen mit der Punktzahl enthalten{ "Joel", "33" }

Das Problem ist, wie können Sie bestätigen, dass die Punktzahl auf legitime Weise erreicht wurde? Vielleicht hat jemand einfach Ihre Protokollpakete mit einem Netzwerkanalysator analysiert und festgestellt, dass nur ein Benutzername mit der Punktzahl gesendet wird. Dann erstellt er dieses Paket manuell und sendet es. Dies ist, was Coderanger mit "Spam aus der Existenz bekommen" meinte.

Zum Speichern der Bestenliste selbst würde ich die Verwendung einer Datenbank wie SQLite empfehlen. Dies gibt Ihnen einen thread-sicheren und gleichzeitigen Speicher- / Zugriffsmechanismus für die Bestenliste. Die zugrunde liegende Datenbank kümmert sich um die Synchronisation.

Für den Netzwerkcode selbst benötigen Sie zwei Teile. Etwas, um die Daten an den Server zu senden und etwas, das sie auf der Serverseite verbraucht und verarbeitet. Wie bereits erwähnt, könnte es so einfach sein wie HTTP / XML / JSON HTTP GET / POST, und dann würde ein Webserver, der auf der Serverseite ausgeführt wird, dies in einem Webdienst verbrauchen. Der gute Teil ist, dass Sie sich nicht mit dem Netzwerkcode für die Serverseite befassen müssen, da dies vom Webserver erledigt wird.

zufälliger Typ
quelle
MySQL würde funktionieren? Das Land, in dem ich MySql-Hosting lebe, ist ziemlich verbreitet und billig (na ja, irgendwie billig).
Speeder
Absolut. Fast jede Datenbank würde zu diesem Szenario passen.
Randomguy
1

Nach meiner Erfahrung müssen Sie mehrere Schritte ausführen. Die Auswahl von C ++ - Bibliotheken ist nicht die dringendste. Es gibt wichtigere Dinge, die Sie berücksichtigen müssen.

Hosting

In Bezug auf das Hosting Ihrer Rangliste müssen Sie eine Wahl treffen. Entweder Sie mieten Server und Sie können die gewünschten Technologien auswählen und tun, was Sie wollen. Oder Sie mieten Hosting-Räume und müssen mit den Technikern zusammenarbeiten, die Ihnen zur Verfügung stehen. Oder Sie verwenden eine der Cloud-Lösungen und müssen mit den Einschränkungen und Vorteilen dieser arbeiten.

Es ist alles eine Frage der Zeitinvestition und der Wiederverwendbarkeit. Wenn Sie bereits einen Server haben, können Sie versuchen, Ihre Bestenlisten dort zu hosten. Wenn Sie bereits eine gehostete Site verwenden, können Sie damit mit dem Prototyping beginnen.

Persönlich würde ich empfehlen, zunächst einen Server oder einen virtuellen Server zu mieten.

Diese Frage verdient einen eigenen Thread und sollte unabhängig beantwortet werden, wenn Sie Schwierigkeiten haben, damit umzugehen.

Bedienung

Welche Servertechnologien Sie verwenden, liegt bei Ihnen und hängt stark von den Hosting-Lösungen ab, die Sie auswählen.

DB

Natürlich können Sie mit einem SQL-Speicher beginnen. MySQL ist ziemlich billig, effizient und einfach zu bedienen und wird von den meisten Hosting-Anbietern unterstützt. Dies ist die Lösung, die ich verwendet habe. Beachten Sie jedoch die Skalierbarkeit, die Sie möglicherweise später bereuen werden.

Es gibt andere bessere Lösungen. ERLANG-basierte DB-Server wie CouchDB sind sehr beliebt. Einer von ihnen, Riak ist einfach über mehrere Server zu verteilen, effizient verwendet JSON und wird von großen Namen wie Mozilla und GitHub verwendet.

Backend

Sie erhalten keinen direkten Zugriff auf Ihren Datenspeicher über Ihre Client-Apps. Sie müssen eine Anwendung schreiben, um Authentifizierungen, Berechtigungen, einige Logiken und den DB-Zugriff zu verwalten.

Java, PHP und Perl werden häufig zum Schreiben von Webdiensten verwendet, die diese Funktionen bereitstellen, von Hosting-Anbietern gut unterstützt werden und starke Entwicklergemeinschaften haben.

Wenn Sie jedoch den Overhead eines vollwertigen HTTP-Servers wie Apache vermeiden möchten, sollten Sie nodeJS verwenden . Es ist eine sehr effiziente, flache und schnelle Lösung. Wird von e-bay, Microsoft und Linked-In verwendet. Es lässt sich sehr gut in Setups integrieren, die JSON für den Datenaustausch verwenden.

Design

Ihr Leaderboard-Design beginnt mit der Datenspeicherung. Was möchten Sie speichern? Wie und wie lange möchten Sie es aufbewahren?

Sie möchten natürlich die Punktzahlen speichern (Zeit, Entfernung, Punkte ...), aber damit haben Sie mehrere Ebenen? Dann müssen Sie die Level-IDs speichern. Unterstützen Sie mehrere Plattformen? Wenn die Schwierigkeit des Spiels aus technischen oder demografischen Gründen auf verschiedenen Plattformen unterschiedlich sein kann, werden Sie das auch speichern ...

Wie willst du es wund machen? Möchten Sie nur die besten Ergebnisse erzielen und alle vorherigen vom Spieler auf derselben Plattform / Ebene / demselben Kontext ersetzen? Oder speichern Sie alles, um alle möglichen Ergebnisse im Auge zu behalten? Halten Sie an den verworfenen vorherigen Ergebnissen für Data Mining fest?

Sobald Sie diese Fragen beantwortet haben, können Sie über die Implementierung nachdenken.

Protokoll

Sie möchten Daten von und zu den Clients übertragen. Dazu müssen Sie ein gutes Kommunikationsprotokoll erstellen.

Die Auswahl der zugrunde liegenden Protokolle ist in diesem Schritt zweitrangig (HTTP, TCP, UDP). Unabhängig von Ihrer Wahl müssen Sie Ihr eigenes Protokoll sorgfältig erstellen, damit Sie mit Fehlern, Protokolländerungen, Anwendungsaktualisierungen usw. umgehen können.

Stellen Sie daher sicher, dass Ihre Serveranwendung Daten für aktualisierte Anwendungen und Anwendungen, auf denen auch ältere Versionen ausgeführt werden, bereitstellen kann.

Stellen Sie sicher, dass die zum und vom Server übertragenen Daten geschützt sind. Seien Sie vorsichtig beim Schutz von Score-Uploads. Sie können Hash-Schlüssel, Verschlüsselung und andere Mechanismen verwenden, um Ihren Server vor Betrügern zu schützen.

Wo immer Sie Binär- oder Textdaten (JSON, XML) senden möchten, liegt ganz bei Ihnen. Aus Gründen der Flexibilität und Kompatibilität würde ich JSON empfehlen. Vermeiden Sie XML. Verwenden Sie Binär, wenn Sie es wirklich brauchen / wollen.

Dieses Thema verdient mehr Aufmerksamkeit und Sie haben möglicherweise weitere Fragen ...

Klient

Der Kunde muss sich in Ihre Lösung integrieren. Sie sollten Ihre Servertechnologie- und Protokollschichten nicht basierend auf der Sprache des Clients auswählen. Sie sollten Ihre Serverlösung in Ihr Spiel integrieren.

Wenn Sie JSON anstelle von HTTP gewählt haben, gibt es dafür Bibliotheken.

Es gibt C / C ++ - Bibliotheken für JSON, ich würde empfehlen, sie zu verwenden. Sie können Ihre eigenen schreiben, wenn Sie möchten. Ich habe in wenigen Stunden eine kleine JSON-Bibliothek geschrieben. Es wird jetzt in Spielen auf Dutzenden von Plattformen verwendet.

In Bezug auf HTTP in C ++ verwenden Sie etwas Moderneres als CURL. cpp-netlib sollte reichen.

Achten Sie beim Senden der Daten jedoch auf die Zeichenkodierungen usw.

Authentifizierung

Um die besten Ergebnisse für Ihre Benutzer speichern und anzeigen zu können, müssen diese irgendwie identifiziert werden. Es gibt mehrere Möglichkeiten.

Das einfachste ist keines. Verwenden Sie das Feld Name hier eingeben, um die Namen in der Bestenliste anzuzeigen.

Sie können die Spieler auch bitten, sich zu registrieren. Dies ist oft ein Prozess, der die Spieler entmutigt.

Eine Möglichkeit, die ich häufig verwendet habe, ist die Facebook-Authentifizierung. Auf diese Weise können Sie die Authentifizierungsdaten an oder über Ihren Server weitergeben, Daten über die Freunde abrufen und personalisierte Bestenlisten bereitstellen, z. B. globale Bestenliste, Bestenliste für Freunde ...

Kojote
quelle
0

Client-Seite: Die Anwendung oder das Spiel verwendet eine http lib wie libcurl oder das sfml-network-Paket. Serverseite: Eine einfache Lösung mit PHP und MySQL, PostgresQL oder SQLite3. Die PHP-Dateien sind versteckt oder für den Benutzer nicht zugänglich.

dotteri
quelle
Diese Antwort könnte verbessert werden, indem über die Verwendung dieser Technologien geschrieben wird, anstatt sie nur aufzulisten.