get external IP address - tcp socket communication

  • Antworten:14
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 33

31.08.2012, 01:21:34 via Website

Nabend zusammen,

ich stehe vor folgendem Problem:

Ich habe mir eine TestApp aufgebaut, in der ich zwischen zwei Activitys switchen kann. Einer ServerActivity und einer ClientActivity.

Nun ist es so, dass ich erst einmal einen String versenden will. Ich habe es bereits geschafft einen String vom Client an den Server zu senden von Emu zu Emu und auch einen String von Emu zu meinem Note, sofern dieses im Wlan eingeloggt ist. Leider konnte ich ich es noch nicht testen, ob es auch zwischen zwei realen Geräten funktioniert.

Mein Problem ist nun aber, was ist, wenn ich mal nicht im Wlan eingeloggt bin, sondern über 3G oder Edge eine Verbindung herstelle?

Die WiFi IP vom Android kann ich mittlerweile so auslesen:

1ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
2 NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
3 if(mWifi.isConnected()){
4 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
5 WifiInfo wifiInfo = wifiManager.getConnectionInfo();
6 int ipAddress = wifiInfo.getIpAddress();
7 String wifiIp = String.format("%d.%d.%d.%d",
8 (ipAddress & 0xff),
9 (ipAddress >> 8 & 0xff),
10 (ipAddress >> 16 & 0xff),
11 (ipAddress >> 24 & 0xff));
12
13 if(wifiIp.length() > 0){
14 return wifiIp;
15 }
16 }

Aber ich komme einfach nicht an die externe IP....

Ich hatte zu Anfang versucht, die IP folgendermaßen auszulesen:

1private String getLocalIpAddress() {
2 try {
3 for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
4 NetworkInterface intf = en.nextElement();
5 for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
6 InetAddress inetAddress = enumIpAddr.nextElement();
7 if (!inetAddress.isLoopbackAddress()) {
8 String ip = Formatter.formatIpAddress(inetAddress.hashCode());
9 return ip;
10 }
11 }
12 }
13 } catch (SocketException ex) {
14 Log.e("ServerActivity", ex.toString());
15 }
16 return null;
17 }

Dort bekomme ich auch IRGENDEINE IP Adresse, nur nicht die richtige. Bin ich im WLan drin, so bekomme ich anstatt der korrekten 192.168.2.107 eine 63.252.252.134. Und anstatt meiner externen ohne WLan (habe ich mit dem Browsern auf dem Android bei wieistmeineip.de nachgesehen) bekomme ich auch wieder eine vollkommen andere ausgegeben.

Also kann mit der Methode ja irgendwas nicht stimmen oder?

Wie könnte ich denn ohne Probleme an die externe IP vom Server kommen? Ausser nu im Browser zu gucken.... und kann ich dann auch über die externe IP des Servers die ich dann in der ClientActivity eingebe auf dem zweiten Gerät, dann einen String an den Server senden?

Ich bin ja schon froh, dass ich es hinbekomme habe einen String im lokalen Netzwerk zu verschicken. Ich hatte mal die externe IP über Edge vom Server in der ClientActivity auf dem Emu eingegeben, aber da bekomme ich dann keine Antwort. Kann es sein, dass es da schonmal an dem Emu liegt?

Wäre super wenn mir da jemand ein wenig helfen könnte.

Grüße

Antworten
  • Forum-Beiträge: 284

31.08.2012, 10:45:39 via Website

Das was du vor hast, wird so nicht funktionieren. Die IP die du da immer bekommst ist die IP eines Routers deines Telefonanbieters.

Wenn deine Server-App über 3G unterwegs, dann befindet sie sich im Netz deines Telefonanbieters und bekommt dort eine netz-interne IP, die von außen nicht ansprechbar ist. Das Problem ist, dass die Anbieter nicht über so viele IP Adressen verfügen, als dass sie jedem Gerät eine "richtige" (weltweit eindeutige) IP Adresse vergeben können. Daher werden lokale IPs vergeben, und nur die Schnittstellen vom internen Netz nach außen, also die Router, bekommen richtige IPs.

Wenn ein Handy nun beispielsweise eine Webseite aufrufen will, dann läuft die Anfrage aus dem internen Netz über den Router an den Webserver der die Webseite hostet. Für den Webserver sieht es aber so aus, als käme die Anfrage nicht vom Handy, sondern vom Router. Der Webserver schickt seine Antwort dann an den Router und der wiederum hat sich gemerkt, dass er vorher für das Handy diese Anfrage gemacht hat und leitet daher die Antwort weiter an das Handy, das er über die interne IP anspricht. So und wenn du nun von Außen nach Innen kommunizieren willst, dann müsstest du auch den Weg über den Router gehen und diesen zunächst ansprechen, das Problem ist aber, dass der Router wiederum nicht weiß, dass er die Nachricht an ein bestimmtest Handy innerhalb des lokalen Netzes weiterleiten soll. Woher sollte er das auch wissen, es gibt tausende Handys im lokalen Netz.

Ein Verbindungsaufbau, kann daher nur von Innen (lokales Netz) nach Außen (Internet) passieren. Wie das dann genau funktioniert, kannst du nachlesen wenn du z.b. bei Wikipedia nach NAT suchst. Dein Router daheim macht letztendlich genau das gleiche.

Das Problem wirst du nur lösen können, indem du irgendeine zentrale Stelle, mit "richtiger" IP, bereit stellst, die die beiden Apps ansprechen und über die sie ihre Daten austauschen können.

Jochen K.

Antworten
  • Forum-Beiträge: 33

31.08.2012, 16:51:12 via Website

Florian, Du bist mein Held :D

Okay, also nutze ich einfach einen meinenr Webserver als zentrale Schnittstelle, über den die Handys dann kommunizieren sofern sich die Handys nicht im selben lokalen Netzwerk bewegen.

Nun hatte ich aber heute morgen auch noch ein anderes Problem, als ich versucht habe, eine Verbindung zweier Geräte im selben lokalen Netzwerk auszuführen.

Ich habe zwei Handys: Ein Galaxy Note (4.0.3) und ein Galaxy Ace (2.3.5).

Als erstes hatte ich das Note als Server eingesetzt und das Ace als Client. Ich konnte dann vom Ace Nachrichten an das Note senden, nachdem ich die lokale IP des Notes im Ace eingegeben hatte.

Nun wollte ich aber auch mal testen, Nachrichten vom Note an das Ace zu schicken. Wenn ich nun aber nun im Note in der ClientActivity die IP vom Ace eingebe und auf Verbinden klicke, so schmiert mir die App ab. Ich kann mir das nicht erklären.

Die LogCat:

108-31 16:44:25.050: E/AndroidRuntime(14895): FATAL EXCEPTION: main
208-31 16:44:25.050: E/AndroidRuntime(14895): android.os.NetworkOnMainThreadException
308-31 16:44:25.050: E/AndroidRuntime(14895): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
408-31 16:44:25.050: E/AndroidRuntime(14895): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
508-31 16:44:25.050: E/AndroidRuntime(14895): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
608-31 16:44:25.050: E/AndroidRuntime(14895): at libcore.io.IoBridge.connect(IoBridge.java:112)
708-31 16:44:25.050: E/AndroidRuntime(14895): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
808-31 16:44:25.050: E/AndroidRuntime(14895): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
908-31 16:44:25.050: E/AndroidRuntime(14895): at java.net.Socket.startupSocket(Socket.java:566)
1008-31 16:44:25.050: E/AndroidRuntime(14895): at java.net.Socket.<init>(Socket.java:225)
1108-31 16:44:25.050: E/AndroidRuntime(14895): at com.example.myserverapplication.MyClient$1.onClick(MyClient.java:54)
1208-31 16:44:25.050: E/AndroidRuntime(14895): at android.view.View.performClick(View.java:3620)
1308-31 16:44:25.050: E/AndroidRuntime(14895): at android.view.View$PerformClick.run(View.java:14292)
1408-31 16:44:25.050: E/AndroidRuntime(14895): at android.os.Handler.handleCallback(Handler.java:605)
1508-31 16:44:25.050: E/AndroidRuntime(14895): at android.os.Handler.dispatchMessage(Handler.java:92)
1608-31 16:44:25.050: E/AndroidRuntime(14895): at android.os.Looper.loop(Looper.java:137)
1708-31 16:44:25.050: E/AndroidRuntime(14895): at android.app.ActivityThread.main(ActivityThread.java:4507)
1808-31 16:44:25.050: E/AndroidRuntime(14895): at java.lang.reflect.Method.invokeNative(Native Method)
1908-31 16:44:25.050: E/AndroidRuntime(14895): at java.lang.reflect.Method.invoke(Method.java:511)
2008-31 16:44:25.050: E/AndroidRuntime(14895): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
2108-31 16:44:25.050: E/AndroidRuntime(14895): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)

Mein Code sieht bisher so aus:

Server:
1public class MyServer extends Activity{
2 ServerSocket ss = null;
3 String mClientMsg = "";
4 Thread myCommsThread = null;
5 protected static final int MSG_ID = 0x1337;
6 public static final int SERVERPORT = 4321; // 6000
7 static final String BLOG_URL = "http://api.externalip.net/ip/";
8 static final String XPATH_STATS = "";
9 private TextView myIP;
10
11
12 @Override
13 public void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.my_server);
16
17 TextView tv = (TextView) findViewById(R.id.clientMessage);
18 myIP = (TextView) findViewById(R.id.myIP);
19 myIP.setText(getLocalIpAddress());
20 tv.setText("Nothing from client yet");
21 this.myCommsThread = new Thread(new CommsThread());
22 this.myCommsThread.start();
23 System.out.println("HASS");
24 }
25
26 // gets the ip address of your phone's network
27 // http://api.externalip.net/ip/
28 private String getLocalIpAddress() {
29 ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
30 NetworkInfo i3G = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
31 NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
32 if(mWifi.isConnected()){
33 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
34 WifiInfo wifiInfo = wifiManager.getConnectionInfo();
35 int ipAddress = wifiInfo.getIpAddress();
36 String wifiIp = String.format("%d.%d.%d.%d",
37 (ipAddress & 0xff),
38 (ipAddress >> 8 & 0xff),
39 (ipAddress >> 16 & 0xff),
40 (ipAddress >> 24 & 0xff));
41
42 if(wifiIp.length() > 0){
43 return wifiIp;
44 }
45 }
46 if(i3G.isConnected()){
47 LoadAsyncTask loadTask = new LoadAsyncTask();
48 loadTask.execute(BLOG_URL, XPATH_STATS, this);
49 return null;
50 }
51
52 return "Fuck";
53
54 }
55
56 public void getIP(String ip){
57 myIP.setText(ip);
58 }
59
60 @Override
61 protected void onStop() {
62 super.onStop();
63 try {
64 // make sure you close the socket upon exiting
65 ss.close();
66 } catch (IOException e) {
67 e.printStackTrace();
68 }
69 }
70
71 Handler myUpdateHandler = new Handler() {
72 public void handleMessage(Message msg) {
73 switch (msg.what) {
74 case MSG_ID:
75 TextView tv = (TextView) findViewById(R.id.clientMessage);
76 tv.setText(mClientMsg);
77 break;
78 default:
79 break;
80 }
81 super.handleMessage(msg);
82 }
83 };
84 class CommsThread implements Runnable {
85 public void run() {
86 Socket s = null;
87 try {
88 ss = new ServerSocket(SERVERPORT );
89 } catch (IOException e) {
90 e.printStackTrace();
91 }
92 while (!Thread.currentThread().isInterrupted()) {
93 Message m = new Message();
94 m.what = MSG_ID;
95 try {
96 if (s == null)
97 s = ss.accept();
98 BufferedReader input = new BufferedReader(
99 new InputStreamReader(s.getInputStream()));
100 String st = null;
101 st = input.readLine();
102 mClientMsg = st;
103 myUpdateHandler.sendMessage(m);
104 } catch (IOException e) {
105 e.printStackTrace();
106 }
107 }
108 }
109 }
110}


Client:
1public class MyClient extends Activity {
2 private Button bt;
3 private TextView tv;
4 private EditText serverIP;
5 private Socket socket;
6 private String serverIpAddress = "10.0.2.2";
7 private boolean serverConnect = false;
8 // AND THAT'S MY DEV'T MACHINE WHERE PACKETS TO
9 // PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S
10 // PORT 6000
11 private static final int REDIRECTED_SERVERPORT = 4321; //5000
12
13 @Override
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.my_client);
17 bt = (Button) findViewById(R.id.sendMessage);
18 tv = (TextView) findViewById(R.id.clientIP);
19 tv.setText(getLocalIpAddress());
20 serverIP = (EditText) findViewById(R.id.serverIP);
21 Button connect = (Button) findViewById(R.id.connectWithServer);
22 connect.setOnClickListener(new OnClickListener() {
23
24 @Override
25 public void onClick(View arg0) {
26 if(serverIP.getText().toString().length() != 0){
27 serverIpAddress = serverIP.getText().toString();
28 }
29 try {
30 InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
31 socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
32 } catch (UnknownHostException e1) {
33 e1.printStackTrace();
34 } catch (IOException e1) {
35 e1.printStackTrace();
36 }
37 serverConnect = true;
38 tv.setText("Connect to Server");
39 }
40 });
41
42
43
44
45 bt.setOnClickListener(new OnClickListener() {
46
47 public void onClick(View v) {
48 if(serverConnect){
49 try {
50 EditText et = (EditText) findViewById(R.id.myMessage);
51 String str = et.getText().toString();
52 PrintWriter out = new PrintWriter(new BufferedWriter(
53 new OutputStreamWriter(socket.getOutputStream())),
54 true);
55 out.println(str);
56 Log.d("Client", "Client sent message");
57
58 } catch (UnknownHostException e) {
59 tv.setText("Error1");
60 e.printStackTrace();
61 } catch (IOException e) {
62 tv.setText("Error2");
63 e.printStackTrace();
64 } catch (Exception e) {
65 tv.setText("Error3");
66 e.printStackTrace();
67 }
68 }
69 else{
70 tv.setText("No Connection");
71 }
72 }
73 });
74 }
75 // gets the ip address of your phone's network
76 private String getLocalIpAddress() {
77 try {
78 for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
79 NetworkInterface intf = en.nextElement();
80 for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
81 InetAddress inetAddress = enumIpAddr.nextElement();
82 if (!inetAddress.isLoopbackAddress()) {
83 String ip = Formatter.formatIpAddress(inetAddress.hashCode());
84 return ip;
85 }
86 }
87 }
88 } catch (SocketException ex) {
89 Log.e("ServerActivity", ex.toString());
90 }
91 return null;
92 }
93}

Wie gesagt, auf dem Ace kann ich die IP des Notes ohne Probleme eingeben und Verbinden und auch versenden nur auf dem Note kann ich die IP nicht eingeben bzw. verbinden.

Antworten
  • Forum-Beiträge: 33

03.09.2012, 15:54:07 via Website

Hi zusammen!

Ich sehe gerade den Wald vor lauter Bäumen nicht. Kann ich auch eine Message vom Server an den Client senden?

Das muss doch irgendwie gehen!? Im moment kann ich problemlos eine Message vom Client an den Server senden. Aber anders herum muss es doch auch gehen. Nur weiss ich gerade absolut nicht wie! Auch Google bringt mich da nicht weiter, da die meisten eine Message vom Client an den Server senden wollen. Oder muss der Server auch gleichzeitig ein Client sein? Oder so...?

Wäre super wenn mir da jemand weiter helfen könnte

Grüße

Antworten
  • Forum-Beiträge: 77

03.09.2012, 16:24:50 via Website

Senden funktioniert genauso wie empfangen. Empfangen machst du über socket.getInputStream(), senden kannst du über socket.getOutputStream().
Wenn das nicht hilft müsstest du mal dein Problem etwas konkreter beschreiben.

Antworten
  • Forum-Beiträge: 33

03.09.2012, 16:55:10 via Website

Mein Problem ist, dass ich nicht genau weiss, wo ich da anfangen soll. Muss ich in der ServerA ein neues Socket Objekt bauen und dem dann wie in der der ClientA mittels

1try {
2InetAddress serverAddress = InetAddress.getByName(serverIpAddress);
3socket = new Socket(serverAddress, REDIRECTED_SERVERPORT);
4}

die IP und den Port vom Client zuweisen?

Und dann so versenden:
1public void sendMessage() {
2 if (serverConnect) {
3 try {
4 String message = entryMessage.getText().toString();
5 PrintWriter out = new PrintWriter(new BufferedWriter(
6 new OutputStreamWriter(socket.getOutputStream())), true);
7 out.println(message);
8 System.out.println("Message wurde versandt");
9 } catch (Exception e) {
10 System.out.println("Message wurde nicht versandt");
11 }
12 }
13 }

Und in der ClientA muss ich die Nachrichten dann ja auch empfangen. Das ja dann über socket.getInputStream. Aber benötige ich dort dann auch ein neues Socket Objekt? Ich blick da absolut nicht mehr durch....bin total verwirrt

ServerA:
1public class ServerActivity extends Activity implements OnClickListener {
2 // Layout
3 private TextView chatProtocoll;
4 private EditText entryMessage;
5 private Button sendMessage;
6
7
8 private Socket s = null;
9 private ServerSocket ss = null;
10 private String mClientMsg = "";
11 private Thread myCommsThread = null;
12 protected static final int MSG_ID = 0x1337;
13 public static final int SERVERPORT = 4321;
14
15
16 @Override
17 public void onCreate(Bundle bundle) {
18 super.onCreate(bundle);
19 setContentView(R.layout.chat_protocol);
20
21 chatProtocoll = (TextView) findViewById(R.id.chatProtocoll);
22 entryMessage = (EditText) findViewById(R.id.typeMessage);
23 sendMessage = (Button) findViewById(R.id.sendMessage);
24 sendMessage.setOnClickListener(this);
25
26 this.myCommsThread = new Thread(new CommsThread());
27 this.myCommsThread.start();
28
29 }
30
31 @Override
32 public void onClick(View v) {
33 long ce = v.getId();
34
35 if(ce == R.id.sendMessage){
36
37 }
38
39 }
40
41
42
43
44 // Handler
45 Handler myUpdateHandler = new Handler() {
46 public void handleMessage(Message msg) {
47 switch (msg.what) {
48 case MSG_ID:
49 chatProtocoll.setText(mClientMsg);
50 break;
51 default:
52 break;
53 }
54 super.handleMessage(msg);
55 }
56 };
57
58 // New thread
59 class CommsThread implements Runnable {
60 public void run() {
61
62 try {
63 ss = new ServerSocket(SERVERPORT );
64
65 } catch (IOException e) {
66 e.printStackTrace();
67 }
68
69 while (!Thread.currentThread().isInterrupted()) {
70
71 Message m = new Message();
72 m.what = MSG_ID;
73 try {
74 if (s == null)
75 s = ss.accept();
76 BufferedReader input = new BufferedReader(
77 new InputStreamReader(s.getInputStream()));
78 String st = null;
79 st = input.readLine();
80 mClientMsg = st;
81 myUpdateHandler.sendMessage(m);
82 } catch (IOException e) {
83 e.printStackTrace();
84 }
85 }
86
87 }
88 }
89}

ClientA:
1public class ClientActivity extends Activity implements OnClickListener {
2 // Layout
3 private TextView chatProtocoll;
4 private EditText entryMessage;
5 private Button sendMessage;
6
7 private Thread myCommsThread = null;
8 private Socket socket;
9
10 private String serverIpAddress = "192.168.2.104";
11 protected static final int MSG_ID = 0x1337;
12 private boolean serverConnect = false;
13 private static final int REDIRECTED_SERVERPORT = 4321;
14
15 @Override
16 public void onCreate(Bundle bundle) {
17 super.onCreate(bundle);
18 setContentView(R.layout.chat_protocol);
19
20 chatProtocoll = (TextView) findViewById(R.id.chatProtocoll);
21 entryMessage = (EditText) findViewById(R.id.typeMessage);
22 sendMessage = (Button) findViewById(R.id.sendMessage);
23 sendMessage.setOnClickListener(this);
24
25 this.myCommsThread = new Thread(new CommsThread());
26 this.myCommsThread.start();
27
28 }
29
30 @Override
31 public void onClick(View v) {
32 long ce = v.getId();
33
34 if (ce == R.id.sendMessage) {
35 sendMessage();
36 }
37
38 }
39
40 public void sendMessage() {
41 if (serverConnect) {
42 try {
43 String message = entryMessage.getText().toString();
44 PrintWriter out = new PrintWriter(new BufferedWriter(
45 new OutputStreamWriter(socket.getOutputStream())), true);
46 out.println(message);
47 System.out.println("Message wurde versandt");
48 } catch (Exception e) {
49 System.out.println("Message wurde nicht versandt");
50 }
51 }
52 }
53
54 // New thread
55 class CommsThread implements Runnable {
56 public void run() {
57
58 try {
59
60 InetAddress serverAddress = InetAddress
61 .getByName(serverIpAddress);
62 socket = new Socket(serverAddress, REDIRECTED_SERVERPORT);
63 serverConnect = true;
64 } catch (Exception e) {
65 // TODO: handle exception
66 }
67
68 }
69 }
70}

Antworten
  • Forum-Beiträge: 77

03.09.2012, 16:57:41 via Website

Nein, das eine Socket Object auf dem Server ist zum Senden und Empfangen da. Im Client ebenso.

Auf dem Server brauchst du die einen Socket selbst zu erstellen, serverSocket.accept() liefert alles was du brauchst.

— geändert am 03.09.2012, 16:59:25

Antworten
  • Forum-Beiträge: 33

03.09.2012, 17:18:04 via Website

Jo super, das hat bis jetzt schon einmal geklappt.

Nu stellt ich mir folgende Frage:

Im moment erstelle ich ja einen Server und der Client muss die IP des Servers eingeben um sich zu verbinden. Gibt es da auch eine Möglichkeit, dass ich als Client sehe, welche Server offen sind ohne die IP einzugeben?

Antworten
  • Forum-Beiträge: 77

03.09.2012, 17:31:39 via Website

Jochen K.
Im moment erstelle ich ja einen Server und der Client muss die IP des Servers eingeben um sich zu verbinden. Gibt es da auch eine Möglichkeit, dass ich als Client sehe, welche Server offen sind ohne die IP einzugeben?

Welche Server "offen" sind?
Du möchtest also eine Liste von allen hunderten Millionen Servern im Internet? Ich glaube, du hast da etwas merkwürdige Vorstellungen.

Deine App braucht natürlich einen Anlaufpunkt, wo deine Server zu finden sind. Ob das jetzt direkt die IP-Adresse oder DNS deiner Server sind, oder du auf anderen Servern eine Liste hinterlegst wo deine Server gerade sind (hört sich so an als hätten sie nicht immer dieselbe Adresse?), oder du dir da was anderes ausdenkst, ist deine Sache.

Antworten
  • Forum-Beiträge: 33

03.09.2012, 17:38:50 via Website

Ne, so war das nicht gemeint :D

Ich hatte mir das so vorgestellt, dass ich im lokalen WLan alle IPs finde, die einen bestimmten Port auf haben. Handy mit der IP 192.168.2.104 macht den Server auf. Und ein anderes Handy mit der 192.168.2.107 öffnet die ClientActivity und sieht zb in einer Liste, dass das Handy mit der 192.168.2.104 einen Server aufgemacht hat und kann dann connecten OHNE eine IP einzugeben....

Ich habe gerade mal sowas getestet:

1for(int i=0; i < 1000; i++){
2 boolean findServer = InetAddress.getByName("192.168.2."+i).isReachable(10);
3 if(findServer){
4 System.out.println("Server gefunden: 192.168.2."+i);
5 }
6 else{
7 System.out.println("Server nicht gefunden");
8 }

So komme ich schoneinmal an alle IPs im lokalen Netzwerk. Nur sauber ist die Lösung wohl nicht.

— geändert am 03.09.2012, 17:39:18

Antworten
  • Forum-Beiträge: 77

03.09.2012, 17:53:27 via Website

Du kannst einen Broadcast ins lokale Netzwerk schicken, auf den der Server reagiert. Broadcasts sind allerdings nur für UDP verfügbar, nicht für TCP. Wenn du deine Kommunikation nicht auf UDP umstellen willst, könntest du es nur nutzen, um die Server-Adresse herauszufinden, und dann eine TCP Verbindung aufbauen.

— geändert am 03.09.2012, 17:53:55

Antworten
  • Forum-Beiträge: 33

03.09.2012, 19:07:52 via Website

Hi,

ich habe mal ein wenig nach dem Thema Broadcast und TCP für Android gesucht und bin dann hier drauf gestoßen:

1private InetAddress getBroadcastAddress() throws IOException {
2 WifiManager myWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
3 DhcpInfo myDhcpInfo = myWifiManager.getDhcpInfo();
4 if (myDhcpInfo == null) {
5 System.out.println("Could not get broadcast address");
6 return null;
7 }
8 int broadcast = (myDhcpInfo.ipAddress & myDhcpInfo.netmask)
9 | ~myDhcpInfo.netmask;
10 byte[] quads = new byte[4];
11 for (int k = 0; k < 4; k++)
12 quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
13 return InetAddress.getByAddress(quads);
14 }

Damit erhalte ich 192.168.2.255

Aber wie komme ich denn nun an die Server Adresse?

Antworten
  • Forum-Beiträge: 284

03.09.2012, 21:43:58 via Website

Das ist die Broadcast Adresse für dein lokales Netz. An die musst du nun ein UDP Paket schicken und dann sollten alle anderen Rechner im Netzwerk antworten. Damit weißt du dann welche Rechner online sind. Du weisst damit allerdings noch nicht, ob der Rechner der Antwortet einer deiner Server ist.

Such einfach mal nach Java, Broadcast und UDP bzw. DatagramSocket. Dann solltest du Infos bekommen, wie man einen Broadcast sendet.

Antworten