Laden...

Aufwand für Chat und Datenaustausch in bestehende Anwendung einfügen für eine Person machbar?

Erstellt von coco07 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.900 Views
C
coco07 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren
Aufwand für Chat und Datenaustausch in bestehende Anwendung einfügen für eine Person machbar?

Hallo liebe Forumgemeinde,

ich befinde mich zur Zeit auf dem Weg in die Selbstständigkeit mittels Spieleentwicklung für Android und iOS. Um ein bestehendes mehr oder weniger "erfolgreiches" Spiel nun etwas professioneller zu gestalten, möchte ich gerne Social-Funktionen einbauen, welche unter anderem aus Clans(Spieler-Profile ansehen, Level einzelner Truppen usw.) und Chats innerhalb eines Clans bestehen sollen. Es soll also kein echter Multiplayer werden, wo ich mir um irgendwelche Realtime Anforderungen Gedanken machen muss, sondern "nur" Profildaten und Chat-Nachrichten hin und her geschickt werden.

Die große Frage, die sich mir hier stellt ist Folgende: Ist der Aufwand für eine Person schlicht zu groß oder ist es durchaus schaffbar, ein solches System einigermaßen auf die Beine zu stellen? Ich programmiere jetzt seit ca 4-5 Jahren(erst Java, dann C#) und teile mich selbst den Fortgeschrittenen zu. Ich kann zwar gut mit Threads und Synchronisierung umgehen, musste dieses aber bisher nicht großartig einsetzen. Mit Socket-Programmierung hab ich mich vor 2-3 Jahren in Java mal "kurz" beschäftigt, allerdings in keinem großen Rahmen.

Ich mache mir vor allem Sorgen um all die Dinge, die ich vielleicht nicht beachte, weil mir einfach die Erfahrung fehlt, um das System aufzubauen. Dazu gehören Dinge wie DDOS-Erkennung, Datenverschlüsselung, schlechte Verbindung eines Clients verwalten usw, Datenaustausch zwischen Server und Datenbank(beide auf dem gleichen Server-System).

Ich würde mich sehr freuen, wenn sich einer vielleicht an seine eigene Anfangszeit mit Server/Client-Modellen erinnern und mir eine Einschätzung geben kann, ob dieses Vorhaben zu groß, oder durchaus schaffbar ist für eine Einzelperson, oder ob es klüger ist, sich dafür jemanden zu suchen, der dieses Wissen mitbringt und direkt umsetzen kann.

Mit freundlichen Grüßen
Coco07

286 Beiträge seit 2011
vor 4 Jahren

Das erste was du machen solltest ist die verschiedenen Technologien zu recherchieren (der Schritt käme eigentlich vor nem Post hier).

Du sagst sehr wenig über das was du bisher hast. Fängst du bei Null oder hast du schon ein bestehendes System? Dann wäre hier der Weg etwas zu wählen das möglichst gut an dein bestehendes System andocken kann.
Wie löst du die Authentifizierung? Sicher soll der User für den Chat keinen separaten Login benötigen. Du brauchst also etwas, dass hiermit kompatibel ist.

Rein zur Technik:
Die Steinzeitvariante wäre der ein Chat via TCP-Socket:

[Tutorial] Client-/Server-Komponente über TCP-Sockets

Da darfst du aber wirklich alles von Grund auf selber programmieren.

Wenn du komplett von vorne anfängst würde ich dir SignalR empfehlen (Tutorial: Real-time chat with SignalR 2).

Wie gesagt sind beides aber nur "wild guesses", weil es eben zu deinem konkreten Anwendungsfall passen muss.

Ich mache mir vor allem Sorgen um all die Dinge, die ich vielleicht nicht beachte, weil mir einfach die Erfahrung fehlt, um das System aufzubauen. Dazu gehören Dinge wie DDOS-Erkennung, Datenverschlüsselung, schlechte Verbindung eines Clients verwalten usw, Datenaustausch zwischen Server und Datenbank(beide auf dem gleichen Server-System).

Hier schmeißt du gerade sehr viele Dinge zusammen, die streng genommen nix miteinander zu tun haben.
Du solltest vllt erstmal ausgiebig recherchieren wie solche Architekturen generell aussehen.

Wenn dein Hauptthema die Spieleentwicklung sein soll, beschäftige dich mal mit Unity. Hier kannst du (in C#) für alle gängigen Plattformen entwickeln und kannst dir die Serverinfrastruktur für Multiplayer recht günstig mieten (zumindest für seeeeehr viel weniger als selber Entwicklen und Hosten)

Beste Grüße
emuuu

2+2=5( (für extrem große Werte von 2)

C
coco07 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

Danke emuuu für die schnelle Antwort 😃

Das erste was du machen solltest ist die verschiedenen Technologien zu recherchieren (der Schritt käme eigentlich vor nem Post hier).

Ich habe mich schhon ein wenig informiert, bevor ich hier diesen Post verfasst habe. Für mich scheint ein einfacher Datenaustausch zwischen Client und Server(abgesehen vom Chat) schon ziemlich komplex zu sein, wenn die Verbindung auch gehalten und nicht nur simple One-Way Texte geschrieben werden sollen. Beim Erstellen eines Clans(Gruppe) beispielsweise, muss der Spieler vom Server eine Genehmigung bekommen, um diesen erstellen zu dürfen. Ebenso müssen Leute in diese Gruppe eingeladen werden können und dann über die Liste an Gruppenmitgliedern auch einzelne Spielerprofile gelesen werden können. Da sind natürlich eine Menge an Regeln und Nachrichten notwendig, damit das reibungslos funktionieren kann.

Du sagst sehr wenig über das was du bisher hast. Fängst du bei Null oder hast du schon ein bestehendes System? Dann wäre hier der Weg etwas zu wählen das möglichst gut an dein bestehendes System andocken kann.
Wie löst du die Authentifizierung? Sicher soll der User für den Chat keinen separaten Login benötigen. Du brauchst also etwas, dass hiermit kompatibel ist.

Ich fange Netzwerktechnisch bei 0 an. Was ich habe, ist ein vollständig funktionierendes Mid-Casual-Game, welches jetzt ebenfalls Social-Content bieten soll. Das Spiel wurde in Unity3D entwickelt(was du weiter unten vorgeschlagen hast 😄). Da Unity3D ein Komponenten-System verwendet und man ein unabhängiges C#-Projekt etwas "anders" aufbaut, muss man sich hier auch erst einmal wieder reinfuchsen. Das soll aber nicht die Schwierigkeit sein, da ich vorher auch schon mit LibGDX(ist sicherlich ein Begriff) ohne Baukasten-Oberfläche entwickelt habe.
Die Authentifizierung soll vorerst allein über die Geräte-ID funktionieren. Der Spieler bekommt also auch bei Neuinstallation des Spiels den gleichen Clan zugewiesen. Eine Authentifizierung über Name/Passwort soll erst später erfolgen.

Wenn du komplett von vorne anfängst würde ich dir SignalR empfehlen ( Tutorial: Real-time chat with SignalR 2).

Wie gesagt sind beides aber nur "wild guesses", weil es eben zu deinem konkreten Anwendungsfall passen muss.

Was ich vor allem brauche, ist Flexibilität. Es soll in Zukunft nämlich nicht bei "einfachen" Funktionen bleiben. Wenn ich ein bestehendes Framework nutze, bin ich doch zumindest eingeschränkter als ohne?

Hier schmeißt du gerade sehr viele Dinge zusammen, die streng genommen nix miteinander zu tun haben.
Du solltest vllt erstmal ausgiebig recherchieren wie solche Architekturen generell aussehen.

Hierbei weiß ich leider nicht, womit ich anfangen soll. Im Endeffekt muss ich mir ja immer nur soviel Wissen aneignen, um die Funktion zu bekommen, die ich brauche. Aber was mache ich, wenn der Server fertig ist und am Ende kommt der Betreiber der Server-Stationen(in diesem Fall wird es wohl Strato werden) mit einer Klage bei mir an, weil ich an z.B. DDOS Attacken nicht gedacht habe und daher einer seiner Systeme ausgefallen ist. Selbst, wenn das völliger Quatsch ist, woher bekomme ich diese Informationen, was Pflicht ist und was nicht. In einem Tutorial steht sowas nicht. Ich hoffe, man kann meine Gedankengänge einigermaßen nachvollziehen 😃

Wenn dein Hauptthema die Spieleentwicklung sein soll, beschäftige dich mal mit Unity. Hier kannst du (in C#) für alle gängigen Plattformen entwickeln und kannst dir die Serverinfrastruktur für Multiplayer recht günstig mieten (zumindest für seeeeehr viel weniger als selber Entwicklen und Hosten)

Das ist wie gesagt schon alles fertig. Im Gegensatz zur Netzwerkprogrammierung kommt mir die Spieleentwicklung allerdings lächerlich vor. Und so unkomplex ist das zu erweiternde Spiel nicht.

Mit freundlichen Grüßen
Coco07

286 Beiträge seit 2011
vor 4 Jahren

Die Authentifizierung soll vorerst allein über die Geräte-ID funktionieren

Das ist eine sehr schlechte Idee.
Bei iOS kommst du aufgrund von Datenschutzbestimmungen gar nicht mehr und bei Android nur über sehr shady Wege an eine UniqueDeviceID. iOS z.B. bietet dir z.B. nur eine VendorID an, die in keiner Weise für Authentifizierung geeignet ist.

Also wenn dein Plan wirklich eine DeviceID ist würde ich das nochmal stark überdenken, allein schon für den Anwendungsfall "neues/mehrere Endgerät/e".

Für mich scheint ein einfacher Datenaustausch zwischen Client und Server(abgesehen vom Chat) schon ziemlich komplex zu sein, wenn die Verbindung auch gehalten und nicht nur simple One-Way Texte geschrieben werden sollen.

Auch hier musst du definieren, was deine Anforderungen sind, willst du wirklich einen "Live-Chat", sprich alle Clients sind dauerhaft mit dem Server verbunden und die es herrscht eine bidirektionale Verbindung Server<->Client. (Das wäre der von mir gepostete Ansatz mit TcpSocket).

Eine andere Möglichkeit wäre, dass die Clients ihre Nachrichten an den Server senden, der die Rezipienten ermittelt, diesen per Push-Notification (im technischen Sinne, nicht wie am Smartphone) mitteilt, dass neue Nachrichten vorliegen und die Clients rufen die dann ab. Hier würde sich ein Http-Client anbieten (mit SignalR für den Push-Teil)

Du solltest dir als Erstes im klaren darüber werden auf welches Protokoll du z.B. setzen willst (XMPP wäre hier eine Möglichkeit).

Was ich vor allem brauche, ist Flexibilität. Es soll in Zukunft nämlich nicht bei "einfachen" Funktionen bleiben. Wenn ich ein bestehendes Framework nutze, bin ich doch zumindest eingeschränkter als ohne?

Das sehe ich genau anders rum. Alles von Grund auf selber schreiben, nimmt dir Flexibilität anstatt dir welche zu geben. Du musst dir alles selber aneignen und tausende Zeilen Code schreiben und merkst dann, dass dein Ansatz vielleicht der falsche war. Der Wechsel eines Frameworks ist da wesentlich einfacher, als die eigene Arbeit komplett in die Tonne zu hauen und was neues von vorne zu beginnen.

So wie ich das lese ist dein Spiel bisher komplett offline. Dann ist der schnellste Weg vermutlich:
Setz mit NetCore eine Api zusammen mit einem IdentityServer um. Deine App wird dann nur um einen http-Client erweitert, der Nachrichten an den Server schickt und diese dort abholt. Dazu brauchst du noch einen SQL-Server in dem du die Nutzerdaten persistent ablegen kannst.
Das ganze kannst du dann z.B. bei Azure oder bei Amazon hosten. Sollte in der Konstellation auch auf Dauer günstiger sein als irgend ein dedicated Server von Strato. Zudem kannst du das ganze viel einfacher skalieren, wenn dein Spiel der nächste Hit werden sollte.

Der Vorteil hierbei ist, dass die Einstiegs-Verständnishürde recht niedrig ist und dass du (vor allem bei der Sicherheit) wenig falsch machen kannst (im Gegensatz zu etwas Selbstgebautem - don't roll own crypto!)

Beste Grüße
emuuu

2+2=5( (für extrem große Werte von 2)

C
coco07 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

Das ist eine sehr schlechte Idee.
Bei iOS kommst du aufgrund von Datenschutzbestimmungen gar nicht mehr und bei Android nur über sehr shady Wege an eine UniqueDeviceID. iOS z.B. bietet dir z.B. nur eine VendorID an, die in keiner Weise für Authentifizierung geeignet ist.

Also wenn dein Plan wirklich eine DeviceID ist würde ich das nochmal stark überdenken, allein schon für den Anwendungsfall "neues/mehrere Endgerät/e".

Hmm... Die Geräte-ID war nur mein erster Gedanke, weil ich in der Unity-IAP fündig geworden bin:
https://docs.unity3d.com/ScriptReference/SystemInfo-deviceUniqueIdentifier.html
Irgendeine eindeutige Adresse muss es ja geben, vielleicht die Mac-Adresse des Gerätes.
Über den Anwendungsfall "neues/mehrere Endgerät/e" habe ich natürlich ebenfalls gedacht, und empfand es als eher unwichtig zur Einführung. Im Notfall kann ich hier immer noch auf bereits vorhandene GameCenter/PlayGames Funktionen zurückgreifen, um bestehenden Fortschritt zu speichern. Hier könnte ich dann ebenfalls auf die Spieler-ID zurückgreifen.
Aber das ist auch wirklich erstmal nur zweitrangig, da ich ja schon beim Grundgerüst nicht weiter komme...

Auch hier musst du definieren, was deine Anforderungen sind, willst du wirklich einen "Live-Chat", sprich alle Clients sind dauerhaft mit dem Server verbunden und die es herrscht eine bidirektionale Verbindung Server<->Client. (Das wäre der von mir gepostete Ansatz mit TcpSocket).

Eine andere Möglichkeit wäre, dass die Clients ihre Nachrichten an den Server senden, der die Rezipienten ermittelt, diesen per Push-Notification (im technischen Sinne, nicht wie am Smartphone) mitteilt, dass neue Nachrichten vorliegen und die Clients rufen die dann ab. Hier würde sich ein Http-Client anbieten (mit SignalR für den Push-Teil)

Das Problem für mich ist einfach, dass ich viele dieser Begriffe nicht einmal kenne. Für mich war nur wichtig: Ich brauche einen Gruppenchat. Wie, was und wo, ist eigentlich nicht weiter wichtig, Hauptsache die Nachrichten kommen an 😄

Mein Grundgedanke war, dass es mir völlig ausreicht, TextNachrichten vom Client zum Server und vom Server zum Client senden zu können. Denn wenn das reibungslos funktioniert und auch Verbindungsabbrüche kein Problem darstellen, kann ich durch z.B. Flags/Kombinationen im Text selbst feststellen, ob diese Nachricht für den Chat gedacht ist, oder eine Funktion wie z.B. "FordereDatenFürSpielerXAn" aufgerufen werden soll. Das ich dafür erstmal 1000 Protokolle und 50 verschiedene Arten, dieses dann auch umzusetzen, studieren muss, war mir nicht bewusst. Wenns nicht anders geht, mache ich mich mal an die Arbeit...

So wie ich das lese ist dein Spiel bisher komplett offline. Dann ist der schnellste Weg vermutlich:
Setz mit NetCore eine Api zusammen mit einem IdentityServer um. Deine App wird dann nur um einen http-Client erweitert, der Nachrichten an den Server schickt und diese dort abholt. Dazu brauchst du noch einen SQL-Server in dem du die Nutzerdaten persistent ablegen kannst.
Das ganze kannst du dann z.B. bei Azure oder bei Amazon hosten. Sollte in der Konstellation auch auf Dauer günstiger sein als irgend ein dedicated Server von Strato. Zudem kannst du das ganze viel einfacher skalieren, wenn dein Spiel der nächste Hit werden sollte.

Da ich bisher im Detail nicht genau wusste, wie ein Server funktioniert, habe ich einfach mal danach gesucht und wurde bei Strato fündig. Der 10er im Monat für einen V-Server mit Windows drauf tut jetzt auch nicht sonderlich weh 😄 Wenn die Skalierung dann natürlich umständlich ist, sollte ich mich hier noch einmal informieren, bevor ich diesen monatlich zahle und das Problem nicht lange auf sich warten lässt.

Wenn ich mir das hier so durch den Kopf gehen lasse, werde ich wohl im Endeffekt einen Dienstleister oder eine einzelne Person für alles netzwerktechnische anheuern müssen, um mich weiterhin um das eigentliche Spiel kümmern zu können.

Ersteinmal ein großes Dankeschön für die Hilfe, tolles Forum 😃

Mit freundlichen Grüßen
Coco07

16.806 Beiträge seit 2008
vor 4 Jahren

Das Problem für mich ist einfach, dass ich viele dieser Begriffe nicht einmal kenne.

Du hast Dich ja selbst entschieden Selbstständig zu sein, und das wort drückt es ja auch aus: Selbstständig.
Wenn Du etwas nicht kennst, dann musst Du Dir das selbstständig beibringen.
Das ist ein Grundpfeiler der Selbstständigkeit. 😃

Für mich war nur wichtig: Ich brauche einen Gruppenchat. Wie, was und wo, ist eigentlich nicht weiter wichtig, Hauptsache die Nachrichten kommen an 😄

Und so eine Haltung ist in der Software Entwicklung alles andere als eine gute Idee.
Du musst mindestens verstehen, was passiert und vor allem wie das sicher passiert - vor allem wenn Du mit Textnachrichten von Nutzern umgehst.
Dazu verpflichtet Dich neben der Moral auch das Gesetz: Du bist verantwortlich.

Das ich dafür erstmal 1000 Protokolle und 50 verschiedene Arten, dieses dann auch umzusetzen, studieren muss, war mir nicht bewusst.

Wollkommen in der Software Entwicklung - willkommen im Web 😃

So wie ich das lese ist dein Spiel bisher komplett offline. Dann ist der schnellste Weg vermutlich:
Setz mit NetCore eine Api zusammen mit einem IdentityServer um. Deine App wird dann nur um einen http-Client erweitert, der Nachrichten an den Server schickt und diese dort abholt. Dazu brauchst du noch einen SQL-Server in dem du die Nutzerdaten persistent ablegen kannst.

Über diese Empfehlungen lässt sich sehr streiten.

Ich würde vom IdentityServer - wenn mögllich - die Finger weglassen.
Nicht wegen dem Produkt, sondern weil man sich eigentlich nicht um Identitäten kümmern sollte - das sollen Profis übernehmen.
Identity sollte man nur selbst hosten, wenn man es wirklich muss.

Ansonsten gibt es zig Dienstleister, allen voran Auth0, die Freemium Modelle bieten.
Für Benutzerdaten brauch ich auch nicht selbst eine Datenbank, die ich selbst warten muss.

Sollte in der Konstellation auch auf Dauer günstiger sein als irgend ein dedicated Server von Strato.

Pauschal ist eine Cloud nicht unbedingt günstiger. Cloud ist erst günstiger, wenn man die nativen Vorteile nutzt.

C
coco07 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

Hallo Abt, danke für deine Antwort 😃

Du hast Dich ja selbst entschieden Selbstständig zu sein, und das wort drückt es ja auch aus: Selbstständig.
Wenn Du etwas nicht kennst, dann musst Du Dir das selbstständig beibringen.
Das ist ein Grundpfeiler der Selbstständigkeit. 😃

Ich verdiene bereits meine Brötchen damit, also keine Sorge, ich weiß, was das bedeutet. Allerdings gibt es einen Kosten/Nutzen-Faktor und ich denke nicht, dass ich ALLE Themen in der Softwareentwicklung selbstständig studieren muss, damit das Endprodukt funktioniert.

Und so eine Haltung ist in der Software Entwicklung alles andere als eine gute Idee.
Du musst mindestens verstehen, was passiert und vor allem wie das sicher passiert - vor allem wenn Du mit Textnachrichten von Nutzern umgehst.
Dazu verpflichtet Dich neben der Moral auch das Gesetz: Du bist verantwortlich.

Die Sicherheit hatte ich ja bereits angesprochen 😉 Und da ich Monate/Jahre brauchen würde, bis ich das gesamte NET-Thema risikofrei und schnell umsetzen könnte, suche ich bereits nach fertigen Frameworks.

Wollkommen in der Software Entwicklung - willkommen im Web 😃

Joa diese Aussage ist wohl nicht allgemeingültig, sondern insbesondere auf das Thema Netzwerk gerichtet. Ich habe innerhalb der Spieleentwicklung bisher Erfolg gehabt, OHNE, dass ich dafür explizit wissen musste, wie die einzelnen Schichten des OSI-Modells funktionieren. Auf Netzwerkebene muss ich mich ja um jedes Bit selbst kümmern, sofern ich nicht ein für mich funktionierendes Framework finde, welches mir diese Dinge abnimmt.

Ansonsten gibt es zig Dienstleister, allen voran Auth0, die Freemium Modelle bieten.
Für Benutzerdaten brauch ich auch nicht selbst eine Datenbank, die ich selbst warten muss.

Die Authentifizierung ist nicht das Problem, sondern ersteinmal eine stabilie und längere Session zwischen Client und Server aufzubauen und zu erhalten. Dabei sollten ständig Nachrichten getauscht werden.

So und nun zu den wirklich wichtigen Dingen: Ich bin im Asset-Store fündig geworden, dieses Asset nimmt mir genau die Arbeit ab, für welche ich Jahre des Lernens bräuchte.
https://assetstore.unity.com/packages/tools/network/master-server-framework-71391

Mit freundlichen Grüßen
Coco07

16.806 Beiträge seit 2008
vor 4 Jahren

Joa diese Aussage ist wohl nicht allgemeingültig, sondern insbesondere auf das Thema Netzwerk gerichtet.

Das Internet hat eine völlig andere Anforderung an Software Entwickler wie reine Offline- oder Desktop Programmierung.
Das beginnt bei den Technologien, geht über die Protokolle und weiter zur Skalierung - und dabei geht es um die Grundzüge und nicht das OSI-Modell.

Daher hab ich meine Aussage auch bewusst so formuliert.
Nimms als Rat an... oder eben nicht.

Die Authentifizierung ist nicht das Problem, sondern ersteinmal eine stabilie und längere Session zwischen Client und Server aufzubauen und zu erhalten. Dabei sollten ständig Nachrichten getauscht werden.

Security ist IMMER ein Problem/Aspekt, denn es gilt: Security by Design.