externe IP ermitteln

Status
Nicht offen für weitere Antworten.

zubi

Aktives Mitglied
Hallo,

will ein ganz kleines Java-Programm schreiben, welches auf Knopfdruck die externe IP ermittelt (für Leute hinter Router). Nun hab' ich mal im Netz nach grundlegenden Methoden gesucht, und bin auf folgende Aussage gestossen:
Here is a simple and elegant solution - hitting the webpage on external server. Webserver knows your real IP address (it has to, otherwise how will it return the page on your request?). Now all you need is the page returning REMOTE_HOST header.

Eine Verbindung über Socket zu einem WebServer ist ja kein Problem, aber komm ich als fragender Client an die REMOTE_HOST-Variable dran? Und wenn ja, wie muss ich den Server genau ansprechen?

Danke & Gruss,
zubi
 

Illuvatar

Top Contributor
Weiß nicht, ob dir das was hilft, das hab ich mal im Forum gefunden, das löst es aber ein wenig anders:
Code:
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class IPbehindaRouter { 

   public static String getIP() { 
      String line = ""; 
      BufferedReader in = null; 
      int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP is " ) ) { 
               return line.substring( 15, ( line.length() - 10 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
   } 
   public static void main (String[] args)
   {
   		System.out.println(new IPbehindaRouter().getIP());
   }
}

Edit: Der Code ist übrigens von alshir.
 

Bleiglanz

Gesperrter Benutzer
meinst du einen einfachen Aufruf einer Webseite, wo dir der Server deine IP sagt?

schreib einfach ein Servlet mit

response.getPrintWriter().print(request.getRemoteAddr()));

schau in die Servlet API
 

zubi

Aktives Mitglied
@Illuvatar: hab's so auch schon gelöst. ich würde aber gerne einen Weg finden ohne den HTML-Code einer Site zu durchsuchen (if( line.startsWith( "<h1>Your IP is " ) ) {....). Trotzdem danke für deine Antwort!

@Bleiglanz: kenn mich noch nicht so wahnsinnig mit Servlets aus, aber wäre es mit deiner Variante nicht so, dass das Servlet auf einer Maschine laufen müsste zu welcher ich die Verbindung aufbaue? (korrigier mich wenn ich falsch liege)

Ich suche eigentlich einen Weg, bei dem ich zu irgendeinem WebServer die Verbindung aufbauen kann und ich dann die externe IP erhalte. So, dass ich nicht auf einen spezifischen Server angewiesen bin (sonst könnte ich die IP über einen ServerSocket dem fragenden Client zurückschicken).
 

Bleiglanz

Gesperrter Benutzer
zubi hat gesagt.:
Ich suche eigentlich einen Weg, bei dem ich zu irgendeinem WebServer die Verbindung aufbauen kann und ich dann die externe IP erhalte. So, dass ich nicht auf einen spezifischen Server angewiesen bin (sonst könnte ich die IP über einen ServerSocket dem fragenden Client zurückschicken).

versteh ich nicht, genau das kannst du mit einem Servlet am allereinfachsten erreichen; wenn du sowas machst, dann schickst du einfach text/plain zurück und du brauchst kein html zu parsen

setzt natürlich einen Webserver voraus?

wahrscheinlich suchst du

SocketAddress getRemoteSocketAddress()
Returns the address of the endpoint this socket is connected to, or null if it is unconnected.

da kann ich nur RTFM sagen
 

zubi

Aktives Mitglied
ich versuch's wie gesagt ohne WebServer zu lösen. Ich möchte, dass Leute die irgendein Problem mit dem PC haben per "Knopfdruck" ihre externe IP ermitteln können (welche dann mir zugemailt wird), damit ich dann per VNC auf ihre Kiste zugreifen kann.

und ja: die API hab' ich natürlich konsultiert, und getRemoteSocketAddress() gibt mir nicht meine extern IP sondern die IP des Endknoten des Sockets.

Wahrscheinlich geht's nicht ohne Servlet oder feste IP (mit ServerSocket). Trotzdem Danke!
 

Bleiglanz

Gesperrter Benutzer
getRemoteSocketAddress() -> war ja auch für den Client gedacht

WO sollen die denn auf einen Knopf drücken, keine Ahnung was du eigentlich willst....
 

Illuvatar

Top Contributor
Sein Problem:
Er hat irgendein Programm, da gibts einen Fehler und Bleiglanz (btw: schöner Avatar ;) ) will einen Fehlerbericht, in dem die IP-Adresse steht. Er will aber keinen Webserver.
Ich glaube, das ging irgendwie mit java.net.NetworkInterface. Das folgende Programm gibt bei mir aber nicht die gewünschte IP aus:
Code:
import java.net.*;
import java.util.*;

public class Networkinttest {

  public static void main(final String[] args) throws Exception {
    Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
    while (eni.hasMoreElements()){
      NetworkInterface ni = eni.nextElement();
      System.out.println("NetworkInterface: " + ni.getName());
      Enumeration<InetAddress> eia = ni.getInetAddresses();
      while (eia.hasMoreElements()){
        InetAddress ia = eia.nextElement();
        System.out.println("InetAddress: " + ia.getHostName() + "(" + ia.getHostAddress() + ")");
      }
    }
  }
}
Mehr weiß ich net.
 

zubi

Aktives Mitglied
So schwer kann das doch nicht zu verstehen sein: jeder der hinter einem Router sitzt hat eine externe (bei dynamischen vom ISP zugewiesen) und eine interne IP. Wenn ich nun zu einem PC hinter einem Router eine direkte Verbindung aufbauen will, brauche ich die externe IP (welche über ipconfig und ähnliches nicht ersichtlich ist). Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.
 

Grizzly

Top Contributor
zubi hat gesagt.:
So schwer kann das doch nicht zu verstehen sein: jeder der hinter einem Router sitzt hat eine externe (bei dynamischen vom ISP zugewiesen) und eine interne IP. Wenn ich nun zu einem PC hinter einem Router eine direkte Verbindung aufbauen will, brauche ich die externe IP (welche über ipconfig und ähnliches nicht ersichtlich ist). Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.

Ich würde auf dem Router - wenn das geht - einen dynamischen DNS Namen einrichten. Bspw. über DynDNS. Dann kannst Du einfach Dir die Adresse Deines Domain-Namens geben lassen.

Beispiel:
Dein DynDNS Domain-Namen: test.dyndns.org
DynDNS bekommt von Deinem Router bei jeder Neueinwahl ins Internet 'ne neue IP und meldet die DynDNS.org. Dort wird das dann eingetragen.
Deine IP (Beispiel): 81.82.83.84

Dann kannst Du Dir über die Klasse InetAddress über den Namen test.dyndns.org die IP geben lassen. In dem Beispiel müsste dann die IP 81.82.83.84 als Ergebnis herauskommen.
 

Bleiglanz

Gesperrter Benutzer
zubi du verstehst mich einfach nicht!

Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.
klar, aber von wo aus????

ein client braucht ja nur eine einschlägige Webseite ansurfen (dnsstuff.com) und sieht sie in seinem Browser

Ich habe dich gefragt, WO WO WO soll der Client auf einen Knopf drücken? Hat der Client schon vorher irgendeine Verbindung zu dir? Ich check einfach nicht, was du willst;

Entweder der Client hat schon einen Socket zu dir aufgebaut

=> kannst du über java.net.* seine IP rauskriegen

Der Client hat noch keinen Kontakt zu dir

=> muss er sich über eine "Webseite" oder anders seine "öffentliche IP" geben lassen

Ich suche nun nach einem Weg diese IP zu ermitteln und will dabei keine WebServer laufen haben.
Das geht so nicht, durch Rumwursteln am lokalen PC kann man diese Adresse nicht rauskriegen (der PC kennt ja nur den Gateway als ansprechpartner, und der macht NAT und sagt dir nichts davon)

Du musst also einen externen Dienst (HINTER dem Gateway) aufrufen, und dieser externe Dienst müsste dir dann die IP, die er sieht, zurückgeben.

WO soll dieser externe Dienst laufen?

WER soll ihn aufrufen?

WIE soll er aufgerufen werden?

ts ts ts
 
G

Guest

Gast
wir haben uns wohl beide missverstanden.

ein client braucht ja nur eine einschlägige Webseite ansurfen (dnsstuff.com) und sieht sie in seinem Browser
genau das sollte mein programm machen: die ip des gateways, hinter welchem der client, der das progi startet, sitzt, soll ermittelt und an den aufrufenden (den gleichen) client zurückgesendet werden, damit sie z.b. in einer variable weiterverarbeitet werden kann. einfacher: die "arbeit" auf dnsstuff.com zu surfen und die ip manuell abschreiben, soll übernommen werden.
und da ich folgendes
Webserver knows your real IP address (it has to, otherwise how will it return the page on your request?). Now all you need is the page returning REMOTE_HOST header.
gelesen habe, hatte ich das gefühl es sei mögich, jeden beliebigen webserver irgendwie ansprechen zu können und so via REMOTE_HOST an die ip zu kommen.

Hat der Client schon vorher irgendeine Verbindung zu dir?
es geht überhaupt nicht darum, dass irgendwer eine verbindung zu mir macht. ich sagte nur, dass das ein anderer weg sei, mein problem zu lösen und dass so die ip problemlos über getRemoteSocketAddress() ermittelt werden könne. dann müsste aber jeder, der das programm ausführt, zu mir verbinden und ich ihm die ip seines gateways zurückschicken, was bedingen würde, dass mein pc immer läuft.

deshalb und wegen dem zitat hatte ich hoffnung, irgendeinen webserver dafür "missbrauchen" zu können.

ich schätze ja deine hilfe, solche bemerkungen sind meiner meinung nach jedoch überflüssig.

gruss,
zubi
 

Bleiglanz

Gesperrter Benutzer
>>genau das sollte mein programm machen:

leider habe ich keine Ahnung, wo dein Programm laufen soll? Am Client? Als Applet?

Dann nimm doch dnsstuff.com, besorg die HTML-Seite über URLConnection und zerlege den String, bis du die IP hast - ist nicht weiter schwer, ist der Zeugs nach dem String

"You appear to be located in GERMANY, based on your IP of"
 
H

highlander78

Gast
Funktioniert der Code bei euch, Ich bekomme als ausgabe " Fehler" in der Konsole



Mfg



Illuvatar hat gesagt.:
Weiß nicht, ob dir das was hilft, das hab ich mal im Forum gefunden, das löst es aber ein wenig anders:
Code:
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class IPbehindaRouter { 

   public static String getIP() { 
      String line = ""; 
      BufferedReader in = null; 
      int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP is " ) ) { 
               return line.substring( 15, ( line.length() - 10 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
   } 
   public static void main (String[] args)
   {
   		System.out.println(new IPbehindaRouter().getIP());
   }
}

Edit: Der Code ist übrigens von alshir.
 

Murray

Top Contributor
Die haben offenbar ihre Seite leicht modifiziert, dort steht jetzt "Your IP Is" anstelle von "Your IP is".
So sollte es gehen:
Code:
if( line.startsWith( "<h1>Your IP Is " ) ) { //--- "is" -> "Is"

Insgesamt ist das natürlich ein eher fragwürdiges Vorgehen; bei jeder Modifikation der HTML-Seite kann es passieren, dass dieser Code angepasst werden muss.
 

highlander78

Mitglied
Hallo brauche bisschen Hilfe von euch.

Habe mir ein kleines Fenster erstellt in dem die IP Angezeigt werden sollte,
die von dem 2ten code in der Konsole ausgegeben wird.
Da ich ein totaler Anfänger bin bringe ich es nicht auf die reihe die Ausgabe in dem erstellten
Text-Fenster zu ausgeben. Könnte dass vielleicht jemand von euch so abändern dass es Funktioniert,
damit ich ein Beispiel habe.Bin wirklich für jede Hilfe dankbar.Kämpfe schon sei Tagen damit..

DANKE



Code:
 import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
 

/**
 *
 * @author  Prymka
 */
public class MyIP extends javax.swing.JFrame {
    
    /** Creates new form MyIP */
    public MyIP() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextPane1 = new javax.swing.JTextPane();
        label1 = new java.awt.Label();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jScrollPane1.setViewportView(jTextPane1);

        label1.setFont(new java.awt.Font("Dialog", 0, 10));
        label1.setForeground(new java.awt.Color(0, 0, 0));
        label1.setText("MyIP -----");

        jLabel1.setText("My IP is:");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(label1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 128, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                        .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 59, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 20, Short.MAX_VALUE)
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 127, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(label1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 20, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(18, 18, 18)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jLabel1))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyIP().setVisible(true);
                       }
                    });
    }
    
    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextPane jTextPane1;
    private java.awt.Label label1;

    private static Object String;

    private static Object e;
    // End of variables declaration
    

  public static  String getIP() { 
      String line = ""; 
            BufferedReader in = null; 
           int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP Is " ) ) { 
               return line.substring( 14, ( line.length() - 5 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
    } 
    
 }



Code:
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class IPbehindaRouter { 

   public static String getIP() { 
      String line = ""; 
      BufferedReader in = null; 
      int i = 0; 
      try { 
         URL getyouripurl = new URL( "http://www.whatismyip.com" ); 
         in = new BufferedReader( new InputStreamReader( getyouripurl 
               .openStream() ) ); 
      } catch( MalformedURLException e ) { 
         System.err.println( e ); 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      try { 
         while( ( line = in.readLine() ) != null ) { 
            if( line.startsWith( "<h1>Your IP Is " ) ) { 
               return line.substring( 14, ( line.length() - 5 ) ); 
            } 
            i++ ; 
         } 
      } catch( IOException e ) { 
         System.err.println( e ); 
      } 
      return "Fehler"; 
   } 
   public static void main (String[] args) 
   { 
         System.out.println(new IPbehindaRouter().getIP()); 
   } 
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Rudolf Socket Externe IP holen und in Textfeld setzen Netzwerkprogrammierung 3
B FTP Externe Library von FTP-Server importieren Netzwerkprogrammierung 5
B Webstart + externe/lokale Plugins/JARS einbinden Netzwerkprogrammierung 10
Semox HTTP Webserver: Externe Dateien werden nicht verwendet. Netzwerkprogrammierung 10
M RMI lokal über externe IP geht nicht Netzwerkprogrammierung 5
S Datenbankzugriff auf externe Mysql DB Netzwerkprogrammierung 9
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
B RMI externe/interne ip problem Netzwerkprogrammierung 2
WerIstDerBoogieman? Wlan Lautsprecher: IP ermitteln? Netzwerkprogrammierung 6
D Ermitteln ob WLAN-Netzwerk UDP unterstützt Netzwerkprogrammierung 1
S Verbingungsart ermitteln Netzwerkprogrammierung 8
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
H Eine Mac-Adresse übers Internet ermitteln Netzwerkprogrammierung 2
M DSL Geschwindigkeit ermitteln Netzwerkprogrammierung 8
c_sidi90 Alle Rechner im Netzwerk ermitteln Netzwerkprogrammierung 17
W Socket Client ermitteln//Code inside Netzwerkprogrammierung 2
U Name eines Netzlaufwerks ermitteln Netzwerkprogrammierung 5
P Name der Download-Datei ermitteln Netzwerkprogrammierung 8
0din Handy schnittsteller ermitteln Netzwerkprogrammierung 8
U Server-IP in Applet ermitteln Netzwerkprogrammierung 4
T IP Adresse mit Hilfe der MAC Adresse ermitteln Netzwerkprogrammierung 3
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
E Größe der Datei vor Download ermitteln Netzwerkprogrammierung 3
G Eigene IP-Adresse hinter Router ermitteln Netzwerkprogrammierung 1
K ServerIP ermitteln Netzwerkprogrammierung 8
T Am RMI-Server: IP des Clients ermitteln? Netzwerkprogrammierung 2
A Methode zum ermitteln des DHCP-Servers & DNS-Servers? Netzwerkprogrammierung 8
A aktive Internetverbindung ermitteln Netzwerkprogrammierung 13
S Verbindungen der Browser ermitteln? Netzwerkprogrammierung 9
U Ende eines Inputstreams ermitteln Netzwerkprogrammierung 3
S Server ermitteln Netzwerkprogrammierung 8
C IP adresse anhand einer domain adresse auslesen / ermitteln Netzwerkprogrammierung 3
G Anzahl verbundener Clients zu einem FTP-Server ermitteln? Netzwerkprogrammierung 4
P HTTPS - öffentliches Zertifikat - ermitteln Netzwerkprogrammierung 5
A Betriebssystem über Netzwerk ermitteln Netzwerkprogrammierung 11
O IP adresse ermitteln Netzwerkprogrammierung 11
I Tatsächliche URL ermitteln Netzwerkprogrammierung 2
G freie ports ermitteln? Netzwerkprogrammierung 3
F konfigurierte Netzwerkverbindunge/DFÜ-Verbindungen ermitteln Netzwerkprogrammierung 4
G Redirects einer HttpURLConnection ermitteln Netzwerkprogrammierung 4
G Bandbreite ermitteln! Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben