TCP Server/ ClientSchleife?!

  • 12 Antworten
  • Letztes Antwortdatum
R

RacerAndroid

Gast
Hallo zusammen,

ich habe eine einfach TCP Server/ Client App programmiert. Der Server ist mein PC und der Client ein Tablet.
Nachdem ich verbunden bin schicke ich einmalig eine Nachricht vom Client zum Server, und dieser antwortet mir ebenfalls einmalig.
So wie kann ich aber das ganze nun weiter führen?
Ja, theoretisch könnte ich eine For-Schleife machen und das eine bestimme Anzahl laufen lassen, ich will jedoch das die Kommunikation solange läuft, bis der Server sagt Stop.
Das Ziel ist es, dass der Server ständig Daten sendet und das Tablet diese verarbeitet.

1. Dazu brauche ich ja eine Art Endlosschleife oder so ähnlich?!
2. Der Client muss bei TCP immer erst antworten bevor der Server was neues schicken kann, richtig?


Über Vorschläge und Tipps zur Umsetzung freue ich mich.

Grüße
 
Hi,

auch wenn ich nicht ganz verstehe worauf du hinauswillst, finde ich das Thema spannend.

Hast du ein WebService auf dem Server implementiert und schickst per HTTP die Anfragen?

Wie wäre es Sockets zu nehmen?
Dort müsste es auch ohne Request/Response gehen. (Also ohne HTTP-Request)
 
Wie wäre es wenn du das ganze in einer while schleife machst? Oo

Lg. Dagobert

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
Grüße,

soll das sowas wie ein Speedtest werden? Würde gerne dein Anliegen mal genauer erfahren.
Wie soll der Sever sagen Stopp? Du kannst eine while schleife verwenden und diese an eine Bedingung knüpfen


edit: wow... bin ich heute wieder langsam ^^
 
TCP?

Wie bitte hast du den Server aufgesetzt. TCP ist ein Protokol und wir u.a. für FTP verwendet. Ohne einen DNS und DHCP Server kann der Server ja seinen verbunden Clients kaum eine IP Adresse zu weisen und den Broadcast senden.

Wenn du nur Daten zwischen CLient und Server austauschen möchtest bitte ich dich um mehr Infos. (da ja ein purer Client Rechner (in dem Fall dein Server) selbst ohne DNS/DHCP Broadcastet sobald eine Netzwerkkarte und entsprechnde Treiber installiert sind).

Also bitte Tablet Version, OS des Rechners und Server Software usw. hierrein.:smile:
 
Vielen Dank für die Antworten...ich habe es hinbekommen!
Nun kommunizieren Server/ Client in einer vorgegebenen Frequenz miteinander.
Das funktioniert mit Nachrichten prima.
Ich habe jetzt im Client zwei Funktionen...senden() und empfangen()
Die werden nacheinander in einer Schleife aufgerufen.
Jetzt habe ich jedoch schon das nächste Problem: folgendes Szenario:

1. Der Server sendet unterschiedliche Nachrichten
2. Der Client empfängt diese Nachrichten, vergleicht die Länge der Nachricht und je nachdem welche angekommen ist, soll er folgendes ausführen:

ImageView imageview = (ImageView) findViewById(R.id.​
bild_eins);

imageview.setImageResource(R.drawable.
bild_zwei);

Wenn ich diese zwei Zeilen mit einem Button verknüpfe, funktioniert es ohne Probleme. Wenn ich es jedoch mit der Schleife verknüpfe, wird das Bild erst am Ende geändert. Rufe ich z.B. senden, empfangen, senden, empfangen, senden, empfangen auf, dann wird das Bild erst beim letzten empfangen geändert. Hat mir jemand einen Rat warum das so ist, bzw. wie ich das ändern kann? Denn in die Funktion in der das Bild geändert wird geht er rein, das habe ich mit Konsolenausgaben überprüft....
 
Wie hast du das denn genau umgesetzt?
Du brauchst für die Netzwerk kommunikation ja einen eigenen Thread.

Aber ich hab hier auch schon oft genug gesehen, dass Leute in der Zeit bis der Thread fertig ist ihren UIThread quasi anhalten und erst wenn die Netzwerkkommunkation fertig ist diesen weiterlaufen lassen.

Wenn du das auch so gemacht haben solltest ist es kein wunder, weil dann arbeitet dein UI-Thread (das ist der Thread, der deine Benutzeroberfläche zeichnet) erst wieder wenn du fertig bist, heißt er setzt nur das letzte bild.
 
Ahh...dann wird das der Fehler sein. Ich habe es so umgesetzt:
- ein Button öffnet das Socket
- Danach kommt in dieser Button-Funktion die Anweisung senden() empfangen(), senden() empfangen(), usw...

Wenn du sagst die Netzwerk Kommunikation braucht einen eigenen Thread, muss ich dann einfach die Funktion mit dem Socket früher schließen und dann die senden(), empfangen() danach laufen lassen?
 
hmm.. eigentlich müsste eine NetworkOnMainThreadException fliegen.
Wobei ich mir nicht sicher bin ob das wenn man einen Socket nutzt auch passiert.

Wie dem auch sei dein Problem wird sein, dass du in die OnClick Methode vom Button gehst.

Darin machst du ja wenn ich das richtig verstehe alles.
Und erst wenn du aus dieser Methode wieder rauskommst wird das Bild geändert, weil dein Programm quasi in deiner Methode gefangen ist.
Und in der Zeit nichts anderes machen kann.
Sollte dein senden und Empfangen im Übrigen zu lange dauern stürtzt sein Programm ab.

Wobei dein bei deinem Code müsste BIld_eins von anfang an zu sehen sein und du änderst das ja nur einmal auf Bild_zwei allerdings auch erst am Ende wie ich oben ausgeführt hab.

Guck dir mal AsyncTask an damit solltest du das hinbekommen können.
 
Hi Amfa,

vielen Dank für deine schnelle Antwort.
D.H. ich mache die Netzwerkkommunikation über den extra Thread AsyncTask.
Kann ich von dort aus dann auch direkt das Bild ändern?
Dann müsste ich theoretisch meinen ganzen Code ja nur in einen AsyncTask packen...wie wird der AsyncTask gestartet?

LG
 
Google und JavaDoc sind dir aber ein Begriff oder?
Du solltest erstmal Grundlagenforschung betreiben...

Einen AsyncTask fürhst du mit execute() aus....
Nein du kannst den Code nicht einfach reinschieben... den GUI Veränderungen dürfen nur aus dem Gui-Thread ausgeführt werden...

lg. Dagobert
 
Zuletzt bearbeitet:
Ok ich habe es soweit gemacht...

Starte AsyncTask jetzt über den Button...muss nur noch herausfinden, wie ich das ganze verbinde, sodass die Bilder sich überlagern
 
Zurück
Oben Unten