DatagramSocket

  • Antworten:6
  • Bentwortet
Reno Krohmann
  • Forum-Beiträge: 8

07.04.2011, 18:57:23 via Website

Moin,

ich bin trotz tagelanger Suche in allen möglichen Foren keinen Schritt weiter gekommen. Ich habe folgendes Problem. Ich habe eine App geschrieben die regelmäßig bestimmte Informationen an einen Server schickt. Funktioniert hervorragend. Nun Antwortet der Server und will einen Nachricht an das Gerät schicken. Die Kommunikation funktioniert auch hervorragend. So lange ich in meinem eigenen Netzwerk bleibe.

Schalte ich WiFi aus und will über meinen Anbieter (Vodafone) kommunizieren kommen keinen Daten mehr an. Ich vermute, dass das Problem darin besteht, dass ich nicht weiß welcher Port gerade frei gegeben ist. Ein Portscan ergibt, dass mindestens ein Port immer frei ist es ist. Bei jedem an / ab Melden ist es aber ein anderer Port. So weiß ich also nicht auf welchem Port ich lauschen soll. Ich habe folgende Klasse zum Empfang von UDP - Pakages geschrieben:
1public class UDPListener extends Thread {
2
3 private static Context con;
4
5 DatagramSocket socket;
6 boolean alive = true;
7 byte[] buffer = new byte[1064];
8 private DatagramPacket packet;
9 private final static int SERVERPORT = 10159;
10 private final static InetAddress SERVERIP = getLocalIpAdress();
11 private static boolean active = false;
12
13
14 public UDPListener(Context c) {
15 con = c;
16 setActive(true);
17 try {
18 packet = new DatagramPacket(buffer, buffer.length);
19 socket = new DatagramSocket(SERVERPORT, SERVERIP);
20 } catch (IOException ex) {
21 throw new RuntimeException("Creating datagram reflector failed", ex);
22 }
23 // Toast.makeText(con, "UDPListener started on IP:" + SERVERIP,
24 // Toast.LENGTH_SHORT).show();
25 DataHelper dhelp = new DataHelper(con);
26 dhelp.insert("MyOwnIP= " + SERVERIP, "msg_out");
27 dhelp.close();
28 }
29
30 @Override
31 public void run() {
32 try {
33 while (alive) {
34 try {
35 packet.setLength(buffer.length);
36 socket.receive(packet);
37 String s = stringFromPacket(packet);
38 DataHelper dhelp = new DataHelper(con);
39 dhelp.insert(s.trim(), "msg_out");
40 dhelp.close();
41 try {
42 Thread.sleep(100);
43 } catch (InterruptedException ex) {
44 // Ignore.
45 }
46
47 Log.v("UDP", "comes" + s);
48 } catch (java.io.InterruptedIOException e) {
49 }
50 }
51 } catch (java.io.IOException ex) {
52 ex.printStackTrace();
53 } finally {
54 socket.close();
55 }
56 }
57.......
58}

Ich habe 1000 verschiedene Möglichkeiten mit dem DatagramSocket ausprobiert. Ich muss ja nicht unbedingt IP und Port angeben dann nimmt er jeden freien Port der da ist. Leider bekomme ich dann auch keine Antwort. Ich suche also einen Weg wie ich herausfinden kann welcher Port denn nun gerade der freie Port ist den Vodafone mir zugewiesen hat.

Ich hoffe ich habe mich halbwegs verständlich ausdrücken können. Hat jemand ne Idee wie ich den offenen Port schnell finden kann?

Vielen Dank
Reno

Antworten
Thomas Welzel
  • Forum-Beiträge: 4

05.01.2012, 23:07:43 via Website

Hi, (schreibe trotz veraltetem Thread, mal gucken, vielleicht besteht dein Problem ja noch)

ich kenne deinen Mobilfunkanbieter und deinen Datentarif nicht, aber es ist sehr wahrscheinlich, dass auch dein Dienstleister eingehende Verbindungen, die also nicht von deinem Android-Device iniziert wurden, unterbindet.
Generell bist du sowohl im WLAN hinter einem Router, als auch bei 3G/UMTS/ etc., einem NAT-Dienst unterworfen, das heißt, dein Android-Device kennt ohne weitere Hilfsmittel weder die öffentliche IP, noch den öffentlichen Port.
Es ist jedoch sehr wohl möglich UDP-Verbindungen aufzubauen, indem dein Android diese iniziert (ist dann jedoch kein klassischer Server). Die Gegenstelle kann in dieses Socket zurückschreiben. Ich habe ebenfalls für mein Android-Phone ein vodafone Datentarif und interessiere mich ebenfalls für diese Art von WebService. Meine ersten Test haben darüber hinaus ergeben, dass jedes ausgehende Datagram einen neuen Port vom vodafone NAT-Dienst zugewiesen bekommt, also einen von 0 - 65535, der Zufall entscheidet. Du wirst also mit der Annahme einen festen Port und gar eine feste IP verwenden zu können, wahrscheinlich nur mit höherpreisigen Vodafone APNs weiterkommen.

Schöne Grüße

Antworten
Reno Krohmann
  • Forum-Beiträge: 8

06.01.2012, 08:41:46 via Website

Moin Thomas,

danke für die Infos aber das Problem habe ich schon vor Monaten gelöst. Sorry wenn ich das hier nicht gepostet habe. Manchmal drückt der Job eben :-).

Vielleicht interessiert es Dich aber wie ich das gemacht habe.

Also sofern ich eine Nachricht schicke bekomme ich eine IP und den Port vom Provider zugeordnet. Dieser bleibt bei allen Anbietern immer eine Minute gültig. Der Trick ist schlicht und einfach, dass alle Minute einen Ping an meinen Server schicke. Bei uns ist das eine leere Nachricht. Da ich aber auch auf der Serverseite meine Finger im Spiel hab kann ich natürlich darauf reagieren. So wissen immer beide Seiten welche IP und Port gerade auf dem mobilen Gerät aktuell sind.

Kommt ein Funkloch oder wird die Verbindung aus irgend einem anderen Grund geschlossen. Warte ich eine Minute und versuche eine neue Verbindung herzustellen. Auf diese Weise habe ich über haupt keine Probleme die Verbindung aufrecht zu halten.

Da es in meiner Anwendung auch nicht auf eine exakte Zeitliche Übermittlung bestimmter Daten ankommt habe ich mein Problem gelöst.

Gruß

Antworten
Thomas Welzel
  • Forum-Beiträge: 4

06.01.2012, 13:22:33 via Website

Hallo,

dass der Job manchmal drückt, das kenne ich. :-)

Woher hast du die Information, dass der Port eine Minute bei allen Providern gebunden bleibt? Sind vermutlich Erfahrungswerte, korrekt?
Hast du auch schon auf diesem Wege einen Web-Server auf einem Android-Phone per 3G, etc. erfolgreich betreiben können?
Man bräuchte dann ja so ähnlich wie dei dir einen Schatten-Server, der die öffentliche IP und den Port mitgeteilt bekommt und zwischen dem Browser und dem Android-Phone vermittelt. Oder wie siehst du das?
Bei vorhandener WebServer-App bräuchte man wahrscheinlich noch eine zweite Bridge-App, die auf dem Android-Device Paketdaten vermittelt.
Dass sich der öffentliche Port ständig ändert, ist echt störend.

Wäre echt cool, wenn du da weiterhelfen kannst! :-)

Schöne Grüße

Antworten
Reno Krohmann
  • Forum-Beiträge: 8

12.01.2012, 15:35:43 via Website

Moin,

sorry wenn's manchmal etwas dauert. Aber lieber spät als nie :D.

Also ich meine die Geschichte mit der einen Minute habe ich irgendwo gelesen. Da gibt es irgend eine DIN oder sowas für. Woher genau ich das habe weiß ich nicht mehr. Aber es scheint mir ziemlich sicher zu sein, dass das so ist.

Zu Deiner eigentlichen Frage kann ich wenig sagen. Um ehrlich zu sein hab ich sie nicht richtig verstanden. Du willst auf dem Gerät einen Server betreiben? Der soll was können? Nur empfangen oder auch senden? Oder willst Du vom Gerät aus auf einen Webserver zugreifen?

Hab ich auch gerade gemacht. Geht sehr gut per SOAP. Da schicke ich alles was ich brauche raus und kriege eben die gewünschte Antwort. Ist auch gar nicht so schwer zu implementieren zwischen Android und PHP.

Falls ich da helfen kann, lass es mich wissen. Falls ich Dich falsch verstanden habe bitte ich um eine genauere Spezifikation Deines Problems.

Gruß

Antworten
Thomas Welzel
  • Forum-Beiträge: 4

12.01.2012, 16:21:52 via Website

Hi,

ja genau, mein Wunschgedanke wäre, z.B. einen fertigen WebServer wie PAW oder ähnlich im öffentlichen Vodafone-Netz auf dem Android-Gerät erreichbar zu machen, trotz der Widrigkeiten wie z.B. NAT auf dem Router des Providers etc.

Antworten
Reno Krohmann
  • Forum-Beiträge: 8

12.01.2012, 16:44:09 via Website

Vielleicht hilft Dir ja https://www.nextpit.de/de/android/forum/thread/391165/PAW-Server-fuer-Android das weiter?

Sonnst stellt sich mir zunächst die Frage was genau Du machen willst. Wer soll Deinen "portablen" Server erreichen? Welche Dienste willst Du zur Verfügung stellen usw.?

Machbar ist alles aber so richtig hab ich immer noch nicht verstanden was genau Du machen willst. Einen Server auf einem mobilen Gerät betreiben. Aber warum? Ist es nicht einfacher den Server irgendwo auf einen "festen Server" zu stellen und dann da drauf zuzugreifen?

Antworten