UDP Client auf Android gerät

  • Antworten:19
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 11:37:03 via Website

Hallo,

ich stehe vor einem Problem was ich nicht ganz verstehe =(
(Kann daran liegen das Sonntag ist ;) )

Ich habe eine Kommunikation zwischen PC und Android geschrieben. Von Android zu PC kein Problem...
Von PC zu Android ein Problem was ich nicht verstehe:

Ich rufe auf dem Android eine runnable auf, in diesem Thread liegt mein UDP Server.
Dieser hat eine While(true) schleife welche aber nur ein mal durch laufen wird!?

Jetzt habe ich mal versucht eine andere Endlos schleife zu bauen(Ebenfalls in einem hintergrund Thread), diese wird aber auch elegant nur einmal ausgeführt ;)

(Alle anderen Probleme hab ich schon gelöst, ip / anmeldung etc. ;) )

In der nächsten Version werde ich auch mal das GCM einbauen, aber möchte jetzt, das es so funktioniert ^_^ es ärgert mich das ich das nicht verstehe >_<


Hier mal der Code ;)
Ich glaube das ist gerade ein TCP client hab da eben was rum gedreht ^_^

1Runnable runnable = new Runnable() {
2 public void run() {
3 ServerSocket ss = null;
4 Socket s = null;
5 int MSG_ID = 0x1337;
6 String mClientMsg = "";
7
8 try {
9 ss = new ServerSocket(11000);
10 } catch (IOException e) {
11 e.printStackTrace();
12 }
13 while (!Thread.currentThread().isInterrupted()) // Klappt auch nicht ... wird nur einmal durchlaufen {
14 Log.d("Nachrit:"," Läuft und Läuft");
15 Message m = new Message();
16 m.what = MSG_ID;
17 try {
18 if (s == null)
19 s = ss.accept();
20
21 BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
22 String st = null;
23 st = input.readLine();
24 Log.d("Nachricht:",st);
25 mClientMsg = st;
26 handler.sendMessage(m);
27 } catch (IOException e) {
28 e.printStackTrace();
29 }
30 }
31 }
32 };

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 11:42:03 via Website

Wie wird das Runnable aufgerufen?
Wird diese Logausgabe noch erzeugt:
1Log.d("Nachricht:",st);
oder kann es sein, dass der BufferedReader "hängen bleibt"?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 11:48:08 via Website

1Log.d("Nachrit:"," Läuft und Läuft");

Wird mir einmal angezeigt,

1Log.d("Nachricht:",st);

wird nicht ausgegeben.




Meine eigentliche "Run" methode ist diese hier, hier habe ich aber genau das Selbe problem....

1public void run() {
2 int PORT = 11000;
3 byte[] buf = new byte[1000];
4 DatagramPacket dgp = new DatagramPacket(buf, buf.length);
5 DatagramSocket sk;
6
7 try {
8 sk = new DatagramSocket(PORT);
9 Log.d("Nachricht"," Läuft!");
10 while (true) {
11 try {
12 sk.receive(dgp);
13 String rcvd = new String(dgp.getData(), 0, dgp.getLength());
14 if(rcvd != null){
15 Log.d("Nachricht"," Empfangen!");
16 }
17 } catch (IOException e) {
18 e.printStackTrace();
19 } }
20 } catch (SocketException e) {
21 e.printStackTrace();
22 }
23 }

— geändert am 09.02.2014, 11:57:40

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 12:12:33 via Website

Dein Code mit dem BufferedReader wartet, bis ein Zeilenumbruch kommt... Du kannst aber nicht einen UDP-Server mit einem TCP-Client verbinden (und umgekehrt).

Bei deiner UDP-Methode wird aber Log.d("Nachricht läuft", "Läuft!") nur einmal ausgegeben, da es außerhalb der Schleife ist.

Kommen im LogCat-Fehler?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 12:17:43 via Website

impjor
Dein Code mit dem BufferedReader wartet, bis ein Zeilenumbruch kommt... Du kannst aber nicht einen UDP-Server mit einem TCP-Client verbinden (und umgekehrt).

Ja, das dachte ich mir auch bereits und bin deswegen wieder auf die UDP variante zurück ^_^


impjor
Bei deiner UDP-Methode wird aber Log.d("Nachricht läuft", "Läuft!") nur einmal ausgegeben, da es außerhalb der Schleife ist.

Hmm du hast recht, ich habe es gerade mal in die Schleife gesetzt und es kommt ebenfalls nur einmal - also keine Veränderung.


impjor
Kommen im LogCat-Fehler?

Der schmeißt mir nur dauerhaft: 02-09 13:16:37.402 806-3647/? E/CellLocation﹕ create GsmCellLocation raus. mehr nicht.


Ansonsten kann ich nichts im LogCat identifizieren was damit zusammenhängen könnte. Auch unter Info / Warning nichts.

VG Jens

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 12:26:49 via Website

1public void run() {
2 int PORT = 11000;
3 byte[] buf = new byte[1000];
4 DatagramPacket dgp = new DatagramPacket(buf, buf.length);
5 DatagramSocket sk;
6
7 try {
8 sk = new DatagramSocket(PORT);
9 Log.d("Nachricht"," Läuft!");
10 while (true) {
11 try {
12 sk.receive(dgp);
13 String rcvd = new String(dgp.getData(), 0, dgp.getLength());
14 if(rcvd != null){
15 Log.d("Nachricht"," Empfangen!");
16 }
17 } catch (IOException e) {
18 e.printStackTrace();
19 } }
20 } catch (SocketException e) {
21 e.printStackTrace();
22 }
23 }
Wird diese Meldung ausgegeben?

Setze mal hinter sk.receive(dgp) ein Log, kehrt die Methode überhapt zurück?

LG

— geändert am 09.02.2014, 12:27:08

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 12:41:21 via Website

1sk.receive(dgp);
2 Log.d("Nachricht"," Empfangen!");

Oh - nein die Methode kommt nicht zurück =/
Es wird nicht ausgegeben.

1public void run() {
2 int PORT = 11000;
3 byte[] buf = new byte[1000];
4 DatagramPacket dgp = new DatagramPacket(buf, buf.length);
5 DatagramSocket sk;
6
7 try {
8 sk = new DatagramSocket(PORT);
9 Log.d("Nachricht"," Läuft!");
10 while (true) {
11 Log.d("Nachricht"," Läuft!");
12
13 try {
14 sk.receive(dgp);
15 Log.d("Nachricht"," Empfangen!");
16 String rcvd = new String(dgp.getData(), 0, dgp.getLength());
17 if(rcvd != null){
18 Log.d("Nachricht"," Empfangen!");
19 }
20 } catch (IOException e) {
21 e.printStackTrace();
22 } }
23 } catch (SocketException e) {
24 e.printStackTrace();
25 }
26 Log.d("Nachricht"," Ende!");
27 }

Auch das "Ende" wird nicht ausgegeben, also der hängt da wirklich =(

Das bedeutet doch, das er dort wartet das eine Nachricht rein kommt?
Also eigentlich ist es richtig ... und an meinem Sender ist irgendwo was falsch...

VG Jens

— geändert am 09.02.2014, 12:44:24

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 12:48:18 via Website

1protected void senden(String Fahrzeug, String text){
2 byte[] ba;
3 DatagramSocket socket;
4 InetAddress ia;
5 DatagramPacket packet;
6 String textsend = null;
7 String gelesen = null;
8 ConnectionHSQL acc = new ConnectionHSQL();
9
10 try {
11 gelesen = acc.AuslesenIP(Fahrzeug);
12 } catch (Exception e) {
13 // TODO Auto-generated catch block
14 e.printStackTrace();
15 }
16
17 String ipadd = gelesen.substring(1);
18
19
20 try {
21 textsend = text ;
22 ba = textsend.getBytes() ;
23 socket = new DatagramSocket();
24 ia = InetAddress.getByName(ipadd);
25 packet = new DatagramPacket(ba, ba.length, ia, 11000);
26 socket.send(packet);
27
28 } catch (IOException e) {
29
30 }
31 acc = null;
32 System.out.println("Nachricht müsste raus sein "+ipadd);
33 }

Also die IP ist richtig, der Port ist richtig, das ByteArray ist naja halt ein ByteArray ...
Die selbe methode benutze ich halt auch im Android um zum PC zu senden und da funktioniert es...


Kann es sein das ich im Android irgendwie mit den Ports ein problem habe? (Stichwort Portforwarding?)

VG Jens

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 12:57:15 via Website

Kopiere doch den Android-Server-Code in ein neues Java-Desktop-Projekt. Ip-Adresse auf localhost umstellen und beide Programme laufen lassen. Dann müsstest du ja sehen, ob deine Codes funktionieren.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 12:59:38 via Website

Genau da ist die Krux ... ich habe auf beiden Seiten den Selben Code.
Sowohl beim Sender, als beim Empfänger.

Deswegen verstehe ich mein Problem auch nicht =(

Da es ja im Desktoptool funktioniert, nur eben in der App nicht.

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 13:04:06 via Website

Also nochmal um das zu klären: Hast du ausprobiert sowohl Client als auch Server mit dem jetzigen Code beide auf deinem Computer laufen zu lassen? Sodass du Nachrichten vom Computer zum Computer senden kannst?
Wenn das geht, kann es eigentlich nur an der Verbindung zwischen Android <-> Computer liegen.
1String ipadd = gelesen.substring(1);
Welche ip-Adresse kommt da raus? Woher weißt du, ob es die richtige ist?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 13:21:23 via Website

Ja ich habe das im Localhost getestet und es funktioniert.

Wenn ich mir "ia" ausgeben lasse kommt raus:
1textsend = text ;
2 ba = textsend.getBytes() ;
3 socket = new DatagramSocket();
4 ia = InetAddress.getByName(ipadd);
5 packet = new DatagramPacket(ba, ba.length, ia, 11000);
6 socket.send(packet);
7 System.out.println("Nachricht müsste raus sein "+ia);

Nachricht müsste raus sein /80.187.102.188

Die IP addresse lade ich aus meiner DB, die DB wird gefüllt immer wenn ich eine nachricht von der App bekomme / die App gestartet wird.
Also gehe ich davon aus das dies die richtige IP addresse ist :)
(ich habe es gerade mal auf dem TAB mit wieistmeineip.de verifiziert und es ist korrekt)

VG Jens

— geändert am 09.02.2014, 13:22:43

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 13:33:42 via Website

Sind beide Geräte im gleichen (W)Lan?
--Wenn ja: Dann kann wieistmeineip.de deine IP-Adresse nicht herausfinden, sondern nur die des Routers. Du musst im Router nachsehen, welche IP-Adresse das jeweilige Gerät hat. (In der FritzBox unter Heimnetz beispielsweise).

--Wenn nein: Dann muss dein Router Verbindungen von außen an das Android-Handy weiterleiten, was alles etwas komplizierter macht. Teste es dann erstmal in selben LAN.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 13:46:50 via Website

Also das verstehe ich nicht:
Das Tablet ist per umts angebunden.

Damit hat es doch nichts mehr mit meinem Router zu tun?!

Nachrichten zu meinen pc musste ich den Port freigeben, ist klar. Aber das Tablet hat dich nichts damit zu tun =/

Nichts desto trotz, ich teste es gleich mal im WLAN...

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 14:05:13 via Website

Stimmt, wenn du UMTS nutzt hat dein Router nichts damit zu tun. Ich weiß aber nicht, ob es überhaupt möglich ist, einen Server auf einem Android-Gerät zu betreiben, der über Mobilfunk erreichbar sein soll.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 14:21:46 via Website

Ja hmm, das muss gehen bin nicht der erste der das macht (laut google).

Nur keiner beschreibt mein Problem ^_^

Kennst du dich mit dem Port gehampel bei Android aus?
Kann es sein das nicht Nachricht nicht an den Richtigen Port geht? (Stichwort PAT)

Antworten
Jens Krämer
  • Forum-Beiträge: 11

09.02.2014, 18:45:12 via Website

Documentation in Eclipse:

Receives a packet from this socket and stores it in the argument pack. All fields of pack must be set according to the data received. If the received data is longer than the packet buffer size it is truncated. This method blocks until a packet is received or a timeout has expired.

Könnte das mein Problem dein das die Größe nicht passt ?
Ich sage Nein, aber kann mich auch irren =/

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 19:21:50 via Website

Hast du es im selben WLAN ausprobiert? Die Größe kann ja kein Fehler sein, wenn es funktioniert wenn Server und Client auf dem selben PC laufen.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Jens Krämer
  • Forum-Beiträge: 11

10.02.2014, 20:17:51 via Website

Da hast du recht, ja hab ich selber Effekt - es kommt nichts an ;)

Ich las heute das Android intern wohl eine umsetzung der Ports macht ...
Jetzt ist für mich nur die goldene Frage auf welchen meine Anfrage umgeleitet wird und wie ich das herraus finde =/

Ich spiel mal was mit einem UDPTester app aus dem Store rum^^

Antworten