Konzept- und Umsetzungsidee von Client-Server App mit TCP-IP Sockets

  • Antworten:4
Ali
  • Forum-Beiträge: 3

25.06.2013, 22:13:46 via Website

Hallo zusammen,

ich benötige einen Rat...

Ausgangslage:
Es besteht ein Server der, mit TCP-IP Sockets mit Clients kommuniziert. Dabei nutzt er ein ganz bestimmtes Protokoll, welches textbasiert ist und als Bytestrom, nicht als Zeichenstrom übertragen wird. Der/die Client ist eine Android App Version 4.1 oder höher. Logischerweise implementieret der Client ebenso das Protokoll und nutzt dabei auch TCP-IP Sockets. Der Client als solches ist bis auf die Views/Acitivites noch nicht umgesetzt, da ich mir nicht wirklich sicher bin was besser ist: Ich benötige ein Konzept, mit dem ich Nachrichten sowohl vom Client schicken als auch auf dem Client vom Server empfangen kann. Abhängig davon, was in einer Nachricht vom Server steht, sollen die Activties mit Inhalt gefüllt werden. Beispielsweise startet die App mit einem Login. Der User gibt die Daten an, klickt auf Anmelden. Jetzt sollen die Daten zum Server übertragen werden, der Login auf dem Server ausgeführt werden und sofern erfolgreich, eine Statusmeldung zurück an den Client geschickt werden, der darauf wartet, diese zu empfangen. Jetzt kommt die Unterscheidung: Wenn in der Statusmeldung steht, dass der Login erfolgreich war, soll mit einem Intent die neue Activity geladen werden, wenn nicht, irgendeine grafische Ausgabe erscheinen, die den User darüber informiert, dass der Login fehlgeschlagen ist.

Wie würdet ihr das umsetzen? - Ein Service brauche ich nicht, da die App nicht länger laufen soll, wenn sie minimiert ist. Idealerweise soll dann die Connection "gepaused" werden. Deshalb würde ich ein Singleton nehmen, welcher sich eine Connection hält, die solange sie läuft vom InputStream liest. Problem daran: Ich kann den Thread nicht ohne weiteres starten, da er Bestandteil des UI-Threads ist und damit bad practice wäre. Wäre also ein Einsatz von AsyncTasks sinnvoll hier? - Wenn ja, hättet ihr ein Codebeispiel, bei dem ich eine Connection über mehrere Activities mit mehreren AsyncTasks nutzen könnte?

Vielleicht bin ich auch voll auf dem Holzweg, aber ich frage mich wie Beispielsweise Apps wie ImmoScout24 dies umgesetzt haben. Anfangs wird vom User ja auch nur ein Formular mit Suchkriterien ausgefüllt und dann der Request zum Server gesendet und eben so lange gewartet, bis das Ergebnis (zumindest die Texte) ausgeliefert sind und erst dann wird der Content auf der Activity wirklich sichtbar. Ist das auch mit AsyncTasks umgesetzt?

Vielen Dank für jegliche Hilfe im Voraus.

Grüße

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

26.06.2013, 10:10:03 via Website

Ich denke die meisten Apps dieser Art werden keine permanente Connection halten, sondern per REST und/oder JSON über atomare Anfragen/Antworten mit dem Server kommunizieren und den Login-Status über eine Art Session-Cookie speichern.
Eine zustandslose Verbindung ist meiner Meinung nach für mobile Datenverbindungen auch deutlich robuster.
Hast Du dir schon Gedanken gemacht was passiert, wenn kurz das Netz weg ist? Baut die App die Verbindung dann automatisch wieder auf, ohne dass der User was mitbekommt? Ist das überhaupt sinnvoll möglich?

Ansonsten, wenn Services keine Option sind, bleibt ein Singleton-Konstrukt (evtl. in Form einer eigenen Application Klasse) wohl die praktikabelste Lösung. Wenn du dort einen neuen Thread spawnst, sehe ich da auch nicht wirklich einen Konflikt zum UI-Thread.

Antworten
Ali
  • Forum-Beiträge: 3

26.06.2013, 11:11:03 via Website

Danke für Deine Antwort. Zustandslose Kommunikation ist vielleicht hierbei besser. Der Grund warum ich mich allerdings für TCP entschieden habe, ist neben der relativ großen Freiheit was man übetragen will auch, dass die Verbindung eben nur einmal aufgebaut wird. Wenn jetzt die Verbindung abreist, kann man das relativ bequem durch einen Timeout abgefangen werden und timergesteuert versucht werden, die Verbindung wieder herzustellen. So war zumindest die Idee dahinter, was in anderen Fällen auch schon funktioniert hat.

Angenommen man realisiert das mit einem Singleton - auch wie du sagst, in Form einer eigenen Application Klasse - wie kann ich dann die Callbacks zum aufrufenden Objekt sicherstellen und währenddessen einen Ladebalken oder irgendwas anzeigen? Die Messages die übertragen werden, sind zwar atomar für den Client, aber dennoch immer auf irgendwelche Aktionen auf dem Client und damit auch auf bestimmte Activities bezogen. In dem Fall müsste ich ja aus der onCreate() Methode einer Activity in die Singleton Klasse rufen: schreibe Request, lese Response und fülle die Activity mit den gelesenen Daten, sobald die Activity gefüllt ist und der User vielleicht noch eine Eingabe gemacht hat, schreibe dies zum Server zurück. Ist das so realisierbar?

Andere Idee, die mir aber noch nicht wirklich gut gefällt, aber wohl so umgesetzt wird, ist mit AsnychTasks zu arbeiten. Jedoch würde es dann eine Art von NetworkTask geben, der sich die ganzen notwendigen Objekte für eine Verbindung zum Server hält (Socket, InputStream, OutputStream, Parser etc.). Ein solcher Task würde dann jeweils in der onCreate() Methode gerufen und genau ein Request und Response realisieren. Problem daran (und ich hab noch nichts gefunden was das Problem löst, ihr vielleicht...?) ich müsste jedesmal wenn der Task erstellt wird, die Verbindung neu aufbauen und abbauen. Das ist zum einen "teuer" was die Performance angeht und zum anderen würde das auf dem Server zu folge haben, dass dauernd neue Threads gestartet werden für einen Request und Response und danach wieder geschlossen werden. Was meint ihr dazu? - Sinnvolle Alternative?

Grüße

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

26.06.2013, 13:05:24 via Website

Ich würde in der Application Klasse eine Möglichkeit vorsehen Listener zu registrieren.
Dann kann sich jede Activity, die ein Interesse daran hat den Netzwerkverkehr mit einer ProgressBar o.ä. zu visualisieren beim onStart registrieren und beim onPause wieder abmelden.
So werden nur Activities mit Events gefüttert, die auch grade laufen...also eigentlich nur die eine im Vordergrund.

Antworten
Ali
  • Forum-Beiträge: 3

27.06.2013, 16:49:43 via Website

Ah okay, merci. Ich versuchs mal so... Werde berichten... ;)

Antworten