# Einfache Rechenoperation über TCP Server



## multihamster (7. Mrz 2022)

Hey Leute, vielleicht kann mir hier jemand schnell weiterhelfen.

Ich will eine simple Android Anwendung programmieren. Ein Interface mit einem Eingabefeld in das eine Zahl eingegeben wird, einen Button der die Rechenoperation auslöst und ein Textfeld welches das Ergebnis vom Server ausgibt.
In das Eingabefeld soll zum Beispiel "192832" eingeben werden und wenn ich dann auf den Button klicke soll die Rechnung ausgeführt werden und der Server z.B. die Quersumme bilden und dann das Ergebnis in meinem Textfeld in meinem Interface ausgeben.

Die Rechnung soll mittels eines TCP Servers gelöst und wieder zurückgesendet werden. Wie könnte das grob aussehen? Die Syntax für den TCP Server habe ich, aber wie binde ich dort meinen Button, meine Eingabefeld und mein Ausgabefeld ein?

Würde mich über eure Hilfe sehr freuen!
Danke schonmal im Voraus!


----------



## Gelöschtes Mitglied 65838 (7. Mrz 2022)

deinem server ist es komplett egal ob da ein button ist

dein server passt nur darauf auf ob eine anfrage kommt dass jemand irgendwas berechnet haben will und liefert das ergebnis zurück
das ergebnis was zurück kommt setzt du dann in dein text feld ein


----------



## multihamster (7. Mrz 2022)

Mein Server nimmt aber die Zahl als Bytestream über TCP entgegen, führt die Berechnung aus und sendet das Resultat zurück.
Das heißt ich würde hier trotzdem die eigentliche Rechenoperation in meine MainKlasse Beispielsweise vornehmen?


----------



## Gelöschtes Mitglied 65838 (7. Mrz 2022)

nein... du fragst beim server an und schickst ihm eine zahl ( objecct stream wahrscheinlich besser aber kann mich auch irren ) 

währenddessen wartet deine App auf eine antwort vom server und erwartet halt ein ergebnis, wenn das da ist dann setzt du dasd ergebnis in dein text feld rein

deine app berechnet gar nix ansich die fragt nur an und wartet auf ein ergebnis


----------



## multihamster (7. Mrz 2022)

ok verstehe, danke schonmal! 
Wie würde eine Implementierung hier vom Server bzw. Client grob aussehen?


----------



## Gelöschtes Mitglied 65838 (7. Mrz 2022)

naja .. server musst du starten und der läuft die ganze zeit... und der client muss den server irgendwie finden

dann sollten die auch noch sachen hin und her schicken können
irgend ein tutorial von den paar millionen die es dazu gibt wird schon passen


----------



## KonradN (7. Mrz 2022)

Mir fehlt da einiges an Informationen bzw. da passt einiges nicht: Was genau ist bitte Dein Ziel? Was willst Du lernen oder erreichen?

TCP Ist ein Protokoll auf dem viele weitere Protokolle aufbauen. Es ist unüblich, da selbst irgendwas mit Sockets zu machen. Webservices sind da der übliche Weg, speziell REST Services. Mit einem der vielen Tutorials hat man auch als Anfänger den in weniger als 1 Stunde.
==> TCP/IP selbst zu machen ist extrem unüblich. Das kann maximal ein "Ich will diese Basics auch lernen" sein, wobei da der Sinn zweifelhaft ist: Wo braucht man das heutzutage noch?
==> Wenn Du mit Sockets spielen willst: Da passt dann Android nicht rein. Das ist unnötige Komplexität und wenn Du eine Sache lernen willst, dann konzentriere Dich darauf. Und dann: Mit Android Webservice anzusprechen wäre dann auch wieder trivial - mit den vielen Tutorials hat man schnell einen ersten Code.

Der Vorteil ist, dass Du hier die volle Unterstützung von Frameworks bekommst was gerade bei Security und Co extrem viel Arbeit abnimmt.


----------



## multihamster (7. Mrz 2022)

KonradN hat gesagt.:


> Mir fehlt da einiges an Informationen bzw. da passt einiges nicht: Was genau ist bitte Dein Ziel? Was willst Du lernen oder erreichen?
> 
> TCP Ist ein Protokoll auf dem viele weitere Protokolle aufbauen. Es ist unüblich, da selbst irgendwas mit Sockets zu machen. Webservices sind da der übliche Weg, speziell REST Services. Mit einem der vielen Tutorials hat man auch als Anfänger den in weniger als 1 Stunde.
> ==> TCP/IP selbst zu machen ist extrem unüblich. Das kann maximal ein "Ich will diese Basics auch lernen" sein, wobei da der Sinn zweifelhaft ist: Wo braucht man das heutzutage noch?
> ...


Es geht hierbei um ein Beispiel das ich lösen muss. Das Beispiel soll uns eben mit TCP bzw. Netzwerkkommunikation und Android Studio etwas vertraut machen.

Aufgabenstellung ist ein einfaches Interface wie oben beschrieben.
Die eingegeben Zahl soll per Bytestream vom Server über die TCP Verbindung (da haben wir eine server-domain und einen Port bekommen) entgegen genommen werden, eine Rechenoperation (zum Beispiel Quersummer der eingegeben zahl ausrechen) und das Ergebnis dann wieder zurückgeben und im Interface anzeigen.


----------



## Gelöschtes Mitglied 65838 (7. Mrz 2022)

aber der server ist ja kein "tcp server" ... das hin und her schicken der daten läuft über TCP aber das kann dir ansich wurscht sein... dich interessiert nur der bytestream auf dem server und der beim client und wie das ping pong funktioniert


----------



## KonradN (7. Mrz 2022)

multihamster hat gesagt.:


> Das Beispiel soll uns eben mit TCP bzw. Netzwerkkommunikation und Android Studio etwas vertraut machen.


Ok, dann entspricht es genau der Aufgabe, dass ihr euch genau mit diesen Dingen auseinander setzt. Zu TCP Servern gibt es einige Tutorials. Ist aber alles relativ einfach, so man mit Threads arbeitet (Alternativ wäre Asynchron das Vorgehen, das genommen würde aus dem nio package. Aber lassen wir das mal einfach).

Server:
- Öffnet einen Server Socket und wartet dann in einer Endlosschleife auf eingehende Verbindungen (accept Aufruf blockiert).
- Immer wenn eine Verbindung zustande gekommen ist, dann wird ein neuer Thread gestartet, der auf Daten vom Client wartet. Immer wenn Daten herein kommen, werden diese ausgewertet und eine Antwort gesendet. Dann wird die Verbindung geschlossen.

Client:
- Hier ist es ähnlich. Hier wird dann aber ggf - um die UI nicht zu blockieren - folgendes gemacht:
--> Eingabe validiert und in Variable gespeichert.
--> Neuer Thread, dieser öffnet einen Socket zum Server. Sobald die Verbindung da ist, wird die Eingabe an diesen geschickt. Danach wird auf die Antwort gewartet. Sobald diese geladen wurde, wird der Socket geschlossen und die Antwort wird an die UI gegeben.


----------



## multihamster (7. Mrz 2022)

KonradN hat gesagt.:


> Ok, dann entspricht es genau der Aufgabe, dass ihr euch genau mit diesen Dingen auseinander setzt. Zu TCP Servern gibt es einige Tutorials. Ist aber alles relativ einfach, so man mit Threads arbeitet (Alternativ wäre Asynchron das Vorgehen, das genommen würde aus dem nio package. Aber lassen wir das mal einfach).
> 
> Server:
> - Öffnet einen Server Socket und wartet dann in einer Endlosschleife auf eingehende Verbindungen (accept Aufruf blockiert).
> ...


Danke schonmal, das hilft mir rein vom Verständnis her schon sehr!
Ich schaffe es einen simplen Taschenrechner in Android Studio zu programmieren. Hier kann ich meine Eingabefelder und Ausgabefelder direkt in der Main.Activity Methode definieren. Wenn ich das ganze aber über einen TCP Server & Client lösen will, lässt er mich in den jeweiligen Klassen aber nicht auf die EditText felder zugreifen. Der Befehl: EditText txt = findViewByID(R.id.editTextID); lässt er nicht zu. Dann sagt er "cannot Resolve Method...


----------



## KonradN (7. Mrz 2022)

multihamster hat gesagt.:


> Wenn ich das ganze aber über einen TCP Server & Client lösen will, lässt er mich in den jeweiligen Klassen aber nicht auf die EditText felder zugreifen. Der Befehl: EditText txt = findViewByID(R.id.editTextID); lässt er nicht zu. Dann sagt er "cannot Resolve Method...


Was genau hast Du denn versucht? Wo ging das nicht?

Auf dem Server kannst Du natürlich nicht auf die Elemente des Clients zugreifen. Wie sollte das auch gehen? Da bekommst Du die Werte im byte Stream übermittelt, dann hast Du die Werte und machst damit etwas. Und dann geht es den gleichen Weg zurück.


----------



## Jw456 (8. Mrz 2022)

Server und Client sind ja zwei getränte Programme die meistens auf unterschiedlichen Geräten laufen.
Wenn beide unter Android laufen soll sind das zwei Apps eine als Server, eine als Client.
Kommuniziert wird über TCP.

Sinnvoller und einfacher ist es zwei Handys zu benutzen im gleichen Lan.

Server warte auf eine TCP Verbindung wird eine hergestellt, empfängt er die Zahl berechnet das Ergebnis, und sendet das Ergebnis über TCP wieder an den Client.

Der Client verbindet sich mit dem Server sendet mittels TCP die Zahl an den Server wartet bis die Antwort kommt und zeigt das Ergebnis an.







						Sending and Receiving Data with Sockets in android
					

Sending and Receiving Data with Sockets in android - This example demonstrate about Sending and Receiving Data with Sockets in androidNeed Server and Client Pro ...




					www.tutorialspoint.com
				











						Socket Programming on Android — TCP Server Example
					

What is Socket Programming




					perihanmirkelam.medium.com


----------



## Jw456 (8. Mrz 2022)

Ps
Wichtig Netzwerk Kommunikation muss bei Android in einen Thread erfolgen.
Das verbinden in Main Thread ist seit Android 3.0 nicht mehr möglich.


Auch seit Android 8 ist Cleartext nicht mehr default Einstellung.
Das solltest du im Manifest hinzufügen. Das wird auch bei einer TCP Socket Verbindung notwendig sein nicht nur bei Http.








						Android 8: Cleartext HTTP traffic not permitted
					

I had reports from users with Android 8 that my app (that uses back-end feed) does not show content. After investigation I found following Exception happening on Android 8:  08-29 12:03:11.246 11285-




					stackoverflow.com


----------



## Jw456 (8. Mrz 2022)

multihamster hat gesagt.:


> Es geht hierbei um ein Beispiel das ich lösen muss. Das Beispiel soll uns eben mit TCP bzw. Netzwerkkommunikation und Android Studio etwas vertraut machen.
> 
> Aufgabenstellung ist ein einfaches Interface wie oben beschrieben.
> Die eingegeben Zahl soll per Bytestream vom Server über die TCP Verbindung (da haben wir eine server-domain und einen Port bekommen) entgegen genommen werden, eine Rechenoperation (zum Beispiel Quersummer der eingegeben zahl ausrechen) und das Ergebnis dann wieder zurückgeben und im Interface anzeigen.


OK da brauchst du ja nur den Client


----------



## multihamster (8. Mrz 2022)

Danke euch Allen, hab es mittlerweile hinbekommen. 
Die Beiträge haben mir sehr geholfen das Problem zu verstehen und richtig anzugehen!


----------

