# IP-Adresse ermitteln



## javaprogger1987 (8. Dezember 2004)

Hallo,

ich hab schon wieder ein Problem ;( und zwar folgendes:
Ich würde gerne die Internet-Ip eines PC's ermitteln, hab bis jetzt nur die Methode
java.net.InetAddress.getLocalHost().getHostAddress()
gefunden, die liefert mit aber die lokale Netzwerkadresse..Gibts da was?

Danke schonmal


----------



## schnuffie (8. Dezember 2004)

```
InetAddress ia = InetAddress.getByName("www.webnobis.com");
System.out.println(ia.getHostAddress());
```


----------



## javaprogger1987 (9. Dezember 2004)

Aber das liefert doch die IP von dem Server von Webnobis oder
Hab ich mich falsch ausgedrückt sry ich meinte die IP vom Rechner auf dem z.B. das Applet läuft..


----------



## cham (9. Dezember 2004)

Das wird dann auch immer die IP sei, die der Rechner hat. Wenn der sich in nem lokalen Netzwerk aufhält ist es auch diese. EIne andere hat kein Rechner der Welt.


----------



## javaprogger1987 (10. Dezember 2004)

Aber... das versteh ich nich... ich hab zum Bsp. im lokalen Netzwerk die IP 192.168.178.20.. und wenn ich nun ins Internet gehe bekomm ich doch noch eine zugewiesen von meinem ISP oder ?


----------



## Bernd1984 (10. Dezember 2004)

Hallo,

    es ist schon so wie cham sagt, du kannst nur deine lokale IP ermitteln, wenn du lokal auf deinem Rechner bist.

    Hier gibt es eine Lösung mit  DynDNS
http://www.tutorials.de/tutorials178040.html

  Und hier kannst du deine Internet-IP ermitteln
http://www.wieistmeineip.de/

 Diese Seite könntest du parsen und damit deine IP ermitteln


----------



## cham (10. Dezember 2004)

javaprogger1987 hat gesagt.:
			
		

> Aber... das versteh ich nich... ich hab zum Bsp. im lokalen Netzwerk die IP 192.168.178.20.. und wenn ich nun ins Internet gehe bekomm ich doch noch eine zugewiesen von meinem ISP oder ?



Die Adresse bekommt aber nicht Dein Rechner sondern der Rechner oder Router, der sich in das Internet einwählt. Einige Router bieten da aber Schnittstellen an um zu ermitteln.

Was hast Du eigentlich mit der IP vor?


----------



## torsch2711 (10. Dezember 2004)

cham hat gesagt.:
			
		

> Die Adresse bekommt aber nicht Dein Rechner sondern der Rechner oder Router, der sich in das Internet einwählt. Einige Router bieten da aber Schnittstellen an um zu ermitteln.
> 
> Was hast Du eigentlich mit der IP vor?




Jep, das ist absolut korrekt. Der Router hat deine Internet-IP und bekommt ja lokal eine vom Router zugewiesen(DHCP-Funktion des Routers) (oder hat Sie fest). Das beste ist, du schaust dir wie vorgeschlagen die API Funktionalität deines Routers an und verwendest diese ggf. Du musst den Router bewegen seine IP rauszugeben.

Andernfalls, könntest du auch versuchen über die Verbindungen von deinem rechner aus, die des Routers zu finden, wenn du weisst welches die ersten 2-3 (*.* oder *.*.* ) stellen der ISP-IP sind und diese dann zu filtern. Nur so als gedanken-gang.

Grüsse

Torsten.


----------



## javaprogger1987 (10. Dezember 2004)

> Zitat von cham:
> Was hast Du eigentlich mit der IP vor?


Also ich habe ja schon ein paar andere Male wegen Sachen hier gepostet, es ging aber im Prinzip immer um dasselbe..
Ich will einen Chat programmieren. Dieser besteht aus einem Servlet, das auf einem Server läuft und RMI-Verbindungen von Applets entgegen nimmt. Dabei ruft z.B. der Server auch Methoden von den Applets auf, z.B. wenn eine neue Nachricht da ist. Das hat den Vorteil, dass das Applet nicht immer z.B. über HTTP anfragen muss ob eine neue Nachricht da ist. Nun ist das Problem, dass es so scheint als würde der Router von jemandem die Anforderung vom Server, eine Methode vom Applet aufzurufen verwerfen..(Ich kann es nicht testen ob es ohne Router geht, da ich niemanden kenne der keinen hat).
Deshalb wollte ich die Verbindung nun über Sockets machen, zumindest wenn ein Router vorhanden ist. Allerdings habe ich das nun mit jemand anders (jemand mit Router) getestet, aber das geht auch irgendwie nicht....

edit:
Ah ich hab grad gesehen warum das mit RMI nicht geht in der Log vom Server steht folgendes:
/-----------------------------------------------------------------
java.rmi.ConnectException: Connection refused to host: 192.168.0.6; nested exception is: 
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:567)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:101)
at chatgame.ChatApplet_Stub.setNextMessage(ChatApplet_Stub.java:107)
at chatgame.ChatServlet.testForRouter(ChatServlet.java:222)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:261)
at sun.rmi.transport.Transport$1.run(Transport.java:148)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:124)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:562)
... 16 more
/------------------------------------------------------------------------------------------------------
Wobei die erwähnte IP (192....) die lokale Ip von meiner "Testperson" ist...


----------



## cham (10. Dezember 2004)

Ja das wird wohl insgesamt nicht so gehen, da Dein Server dann zwar die Info an den Router schicken kann, wenn er die korrekte IP hat, der aber ja nicht weiß auf welchem lokalen Host der Client läuft. 

Du wirst IMHO nicht um einen Scheduler drumrumkommen, der nachfragt ob es neue Nachrichten gibt.

Ich lass emich aber gern eines besseren belehren.


----------



## javaprogger1987 (10. Dezember 2004)

Stimmt...Daran hatte ich gar nicht gedacht.. 
D.h. jeder  Chat funktioniert so... Oder reicht das wenn man den Scheduler nur macht wenn ein Router vorhanden ist (kann man ja testen lassen)?

edit:
aber das ist doch total ineffektiv oder? da muss es doch eine möglichkeit geben..*denkopfaufdentischhaut*......


----------



## takidoso (16. Dezember 2004)

Halli hallo,
also zunächst mal folgendes. Ich meine man bekommt durchaus die IP-Adresse unter der der angemeldete Rechner ansprechbar ist. Keine ahnung ob dat nu die adr eines Routers sein mag oder nicht..

ich habe zum einen eine dyndns adresse in der ich das ganze recht gut verifizieren konnte (nähmlich die Adressen die mir java ausspuckt mit der adresse, die mir dyndns anzeigt verglichen)

folgende Zeilen können da sehr hilfreich sein

```
String hostName = InetAddress.getLocalHost().getHostName();
            InetAddress[] adrs = InetAddress.getAllByName(hostName);
            hostAdr   = "localhost";
            System.out.println(hostAdr);
            System.out.println("Adressen:");
            for(int i=0; i<adrs.length; i++)
            {
                System.out.println(adrs[i]);
                System.out.println("Hostname ="+adrs[i].getHostName());
                System.out.println("isAnyLocalAddress ="+adrs[i].isAnyLocalAddress());
                System.out.println("isLinkLocalAddress="+adrs[i].isLinkLocalAddress());
                System.out.println("isLoopbackAddress ="+adrs[i].isLoopbackAddress());
                System.out.println("isMCGlobal        ="+adrs[i].isMCGlobal());
                System.out.println("isMCLinkLocal     ="+adrs[i].isMCLinkLocal());
                System.out.println("isMCNodeLocal     ="+adrs[i].isMCNodeLocal());
                System.out.println("isMCOrgLocal      ="+adrs[i].isMCOrgLocal());
                System.out.println("isMCSiteLocal     ="+adrs[i].isMCSiteLocal());
                System.out.println("isMulticastAddress="+adrs[i].isMulticastAddress());
                System.out.println("isSiteLocalAddress="+adrs[i].isSiteLocalAddress());
            }
```

und hoppla ... eine der so aufgelisteten Adressen ist die für draußen.

Ich hoffe es hilft,

Takidoso

PS: warum baust Du Dir Dein Chatprogramm nicht mit Socketprogrammierung?
ich selbst habe so die Kommunikation meines Q-Schachspiels + Chat gebastelt.


----------



## takidoso (16. Dezember 2004)

da fällt mir grade auf, dass das ganze auch offenbar so geht

*hostAdr  = InetAddress.getLocalHost().getHostAddress();*

also eigetnlich ganz einfach ;-)

Wenn man den code im JDK anschaut, sieht man bei  getHostAddress() lediglich ein return null;
offenbar wird da etwas beim Aufbau des Sockets so manches ausgetauscht (es lebe der Polymorphismus!)

Takidoso


----------



## javaprogger1987 (17. Dezember 2004)

Naja also warum ich das nicht über Sockets mache... Dann gehts ja trotzdem nicht ohne Scheduler wenn ein Router vorhanden ist..

Dann kann ich auch RMI ´benutzen, das hat den Vorteil das das eine Ebene höher abläuft und ich nicht noch viele Befehle definieren muss, die dann der Server auswertet, z.B. neue Nachricht oder neuer User usw...


----------



## takidoso (17. Dezember 2004)

hmmm,
also einen Scheduler? wie sollte der aussehen? und Router... sollte das dem Chatprogramm nicht egal sein?
also ich habe mein Zeug mit Hilfe eines Chatprogramm-Beispiels auf Socketebene gebaut. Das ganze Läuft über Threads. 
Es gibt einen Serverthread, der im wesentlichen sich an ihn verbindende Rechner bemerkt und dafür einen sogenannten client-Thread aufmacht der dann die ankommenden Nachrichten entgegennimmt und abarbeitet. Um solche Dinge wie Es handelt sich um eine Nachricht an, oder es meldet sich jemand an, mit z.B. Usernamen oder jemand sendet eine private nachricht oder jemand sendet eine anonyme Nachricht, oder jemand macht einen Schachzug (jetzt für meinen Fall) wird mit Hilfe eines Kennwertes (man könnte auch Operationswertes Anfangs in den Bytestrohm mitgegeben. Einfach ein Integer, der dann mittels eines Switch-case ausgewertet wird.
Einen Scheduler habe ich dabei nicht basteln müssen, da ja sowieso alle angebundenen Clients auf dem Server ihren eigenen Thread haben.
Anderseits hast Du recht es ist eine Ebene tiefer. Aber ob das Know How wirklich mehr ist es zu bewerkstelligen als über RMI, denn da benötigst Du auch ne Menge Know How, da Du RMI Philosophie 'befriedigen' mußt, und mich damit auseinanderzusetzen, hatte ich irgendwie nicht so arg Lust, zumal ich ein nettes Beispiel hatte, welches ich jedoch auf meine persöhnliche Art umgebaut und erweitert hatte. Und man kann das Zeug auch prima kapseln so dass es in der eigentlichen Anwendung nicht so ein arger Wust wird.

Takidoso

PS: wie sieht eigntlich bei Dir der Scheduler prinzipiell aus und wofür wird er genau benötigt? Ich hätte sonst angenommen das es eine Nachrichten-Queue für ein Chat-System ausreichen sollte.


----------



## takidoso (17. Dezember 2004)

Ahhh sorry, vergiss alles was ich schrieb, nu kapiere ich warum (hihi)
Du hast zu Hause ein Netzwerk und gehst über Deinen eigenen Router raus, gelle :-D
Ich weiß zwar nicht ganz ob ich da richtig liege, aber mal ne blöde Frage ... Kann man das nicht über Proxy-Einstellungen lösen?
oder liege ich da ganz falsch?

Takidoso


----------



## javaprogger1987 (18. Dezember 2004)

Jo so ähnlich 

Ich hab das Problem, das viele für die der Chat sein soll (wird später noch ein Spiel) DSL Nutzer sind. Das Problem ist nun das das über Router nicht funktioniert, da der Router die Nachrichten die der Server zum Client sendet verwirft, weil er nicht weiß für wen die Nachricht ist. Der Scheduler fragt in bestimmten Zeitabständen (ca. 1sek) beim Server nach, ob neue Events (egal was) passiert sind. Das Problem davon ist wie gesagt, das es Unmengen an Traffic verursacht.
Im Prinzip könnte man das lösen, indem man den Router so konfiguriert, das er die Nachrichten vom Server richtig weiterleitet (ich denke das meinst du mit proxy), allerdings geht das bei allen unterschiedlich, bei manchen garnicht. Und wenn jeder erst seinen Router neu konfigurieren muss um den Chat zu benutzen will das wohl keiner


----------

