जावा में 'बाहरी' आईपी एड्रेस प्राप्त करना


83

मुझे यकीन नहीं है कि मशीन का बाहरी आईपी पता प्राप्त करने के बारे में कैसे जाना जाता है क्योंकि एक नेटवर्क के बाहर एक कंप्यूटर इसे देखेगा।

मेरे निम्नलिखित IPAddress वर्ग को केवल मशीन का स्थानीय IP पता मिलता है।

public class IPAddress {

    private InetAddress thisIp;

    private String thisIpAddress;

    private void setIpAdd() {
        try {
            InetAddress thisIp = InetAddress.getLocalHost();
            thisIpAddress = thisIp.getHostAddress().toString();
        } catch (Exception e) {
        }
    }

    protected String getIpAddress() {
        setIpAdd();
        return thisIpAddress;
    }
}

13
आप जानते हैं कि एक मशीन में एक साथ कई सार्वजनिक पते हो सकते हैं? वे वास्तव में एक मशीन नहीं बल्कि एक नेटवर्क इंटरफ़ेस से जुड़े हैं।
डोनल फेलो

जवाबों:


168

मुझे यकीन नहीं है कि आप उस आईपी को स्थानीय मशीन पर चलने वाले कोड से हड़प सकते हैं।

हालाँकि, आप एक वेबसाइट पर चलने वाले कोड का निर्माण कर सकते हैं, JSP में कह सकते हैं, और फिर कुछ ऐसी चीज़ का उपयोग कर सकते हैं, जहाँ अनुरोध आया है, जहाँ से IP लौटाता है:

request.getRemoteAddr()

या बस पहले से मौजूद सेवाओं का उपयोग करें जो ऐसा करते हैं, फिर आईपी का पता लगाने के लिए सेवा से उत्तर को पार्स करें।

AWS और अन्य जैसे webservice का उपयोग करें

import java.net.*;
import java.io.*;

URL whatismyip = new URL("http://checkip.amazonaws.com");
BufferedReader in = new BufferedReader(new InputStreamReader(
                whatismyip.openStream()));

String ip = in.readLine(); //you get the IP as a String
System.out.println(ip);

4
चेतावनी का शब्द: उन्होंने स्वचालन URL को स्वचालन में
।wismismip.com

8
मैं सुझाव दूंगा कि कम से कम दो सर्वर जो आपके आईपी को कार्य करता है, यदि उनमें से कोई एक पल में बंद हो जाता है (निश्चित रूप से सही त्रुटि से निपटने के साथ)। मेरा choise externalip.net होगा ("एक एपीआई की आवश्यकता है?" लिंक पर क्लिक करें)। अब उस साइट का उपयोग एक साल से अधिक समय से कर रहे हैं, अब तक कोई समस्या नहीं हुई है और यह एक तेज़ सेवा है जो हमेशा त्वरित प्रतिक्रिया देती है।

बहुत बढ़िया लिंक; मैं इसे विश्वविद्यालय नेटवर्किंग असाइनमेंट पर अवधारणा के प्रमाण के भाग के रूप में उपयोग करूंगा!
अरिसबेक

एक अन्य विकल्प यह होगा कि यदि आपके पास एक वेब सर्वर या होस्ट खाता है जो PHP चलाता है, तो ऊपर दिए गए कोड @bakkal का उपयोग करें और इसे अपनी स्वयं की PHP फ़ाइल में इंगित करें जिसमें बस शामिल है echo $_SERVER['REMOTE_ADDR'];। यदि यह स्क्रिप्ट की एकमात्र या पहली आउटपुट लाइन है जो आप सभी सेट कर रहे हैं।
किंग्सओल्मन

7
Whatsmyip.com इस प्रकार के स्वचालन का समर्थन नहीं करता है।
किंग्सलमेन

79

@Stivlo द्वारा टिप्पणियों में से एक उत्तर देने के लिए योग्य है:

आप अमेज़न सेवा http://checkip.amazonaws.com का उपयोग कर सकते हैं

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class IpChecker {

    public static String getIp() throws Exception {
        URL whatismyip = new URL("http://checkip.amazonaws.com");
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(
                    whatismyip.openStream()));
            String ip = in.readLine();
            return ip;
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

19

सच यह है: 'आप नहीं कर सकते' इस अर्थ में कि आपने प्रश्न प्रस्तुत किया है। NAT प्रोटोकॉल के बाहर होता है। आपकी मशीन के कर्नेल के लिए यह जानने का कोई तरीका नहीं है कि आपका NAT बॉक्स बाहरी से आंतरिक आईपी पते तक कैसे मैप कर रहा है। अन्य उत्तर यहां बाहर की वेब साइटों से बात करने के तरीकों को शामिल करते हैं।


3
या नहीं, क्योंकि यह मूल प्रश्न का उत्तर नहीं देता है, और यह एक अकादमिक अभ्यास जैसा दिखता है
ब्रूनो बोसोला

निष्पक्ष होने के लिए, यह उत्तर प्रश्न का उत्तर देता है और अन्य दर्जन उत्तर मूल रूप से एक ही बात कहते हैं, लेकिन बाहरी आईपी चेकर के किसी भी विकल्प के लिए विशिष्ट कोड या URL दिखाते हैं।
थॉमस कार्लिस्ले

14

यह सब अभी भी जारी है और सुचारू रूप से काम कर रहा है! (२३ सितंबर २०१ ९ तक)

सलाह का टुकड़ा: केवल उनमें से किसी एक पर निर्भर न रहें; एक का उपयोग करने की कोशिश करो, लेकिन दूसरों को देखते हुए एक आकस्मिक योजना है! जितना अधिक आप का उपयोग करें, बेहतर!

सौभाग्य!


12

जैसा कि @ डॉनल फेलो ने लिखा, आपको मशीन के बजाय नेटवर्क इंटरफेस को क्वेरी करना होगा। मेरे लिए काम किए गए javadocs का यह कोड:

निम्नलिखित उदाहरण कार्यक्रम एक मशीन पर सभी नेटवर्क इंटरफेस और उनके पते सूचीबद्ध करता है:

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNets {

    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
} 

उदाहरण कार्यक्रम से निम्नलिखित नमूना आउटपुट है:

Display name: TCP Loopback interface
Name: lo
InetAddress: /127.0.0.1

Display name: Wireless Network Connection
Name: eth0
InetAddress: /192.0.2.0

से docs.oracle.com


1
धन्यवाद! जब यह समाधान काम नहीं करेगा जब सॉफ्टवेयर एक NAT के पीछे है, यह अभी भी सर्वर सॉफ्टवेयर के लिए बहुत उपयोगी है जो आपको पता है कि NAT के पीछे नहीं होगा, या एक कमबैक के रूप में यदि सॉफ्टवेयर इसे प्राप्त करने के लिए किसी अन्य सर्वर से कनेक्ट नहीं कर सकता है। आईपी। विशेष रूप से इंटरनेट से डिस्कनेक्ट किए जाने वाले LAN पर चलाए जाने वाले सॉफ़्टवेयर के लिए, यह जाने का तरीका है।
पैवन

6

कुछ साइट जैसे www.whatismyip.com पर HttpURLConnection करें और पार्स करें कि :-)


5

इस बारे में कैसा है? यह सरल है और मेरे लिए सबसे अच्छा काम है :)

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


public class IP {
    public static void main(String args[]) {
        new IP();
    }

    public IP() {
        URL ipAdress;

        try {
            ipAdress = new URL("http://myexternalip.com/raw");

            BufferedReader in = new BufferedReader(new InputStreamReader(ipAdress.openStream()));

            String ip = in.readLine();
            System.out.println(ip);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

यह उत्कृष्ट है! मैं कोशिश करूँगा जब मैं घर पहुँचूँ। यह ठीक उसी तरह की समस्या है जिसे मैं हल कर रहा था। पता नहीं क्यों यह उच्च मतदान नहीं किया गया है।
एडम893

4

http://jstun.javawi.de/ यह करेगा - बशर्ते आपका गेटवे डिवाइस STUN) को सबसे अधिक कर दे)


1
काफी दिलचस्प, यह बाहरी सेवाओं के उपयोग के बिना उम्मीद के मुताबिक काम करता है लेकिन बस गेटवे पर बात कर रहा है। GPL लाइसेंस हालांकि इसके गोद लेने को सीमित करेगा।
ब्रूनो बोसोला

साइट मुझे एक लॉगिन स्क्रीन दे रही है। शायद मूल नहीं।
जुस 12

1

यह आसान नहीं है क्योंकि एक लैन के अंदर एक मशीन आमतौर पर इंटरनेट के लिए अपने राउटर के बाहरी आईपी के बारे में परवाह नहीं करती है .. इसे बस इसकी आवश्यकता नहीं है!

मैं आपको http://www.whatismyip.com/ जैसी साइट खोलकर और html परिणामों को पार्स करके आईपी नंबर प्राप्त करके इसका फायदा उठाने का सुझाव दूंगा .. यह उतना कठिन नहीं होना चाहिए!


2
आपको html को पार्स नहीं करना है। Whatismyip.com के वेबपेज स्रोत की पहली पंक्ति आपका बाहरी आईपी है।
मार्टिज़न कोर्टो

0

यदि आप JAVA आधारित वेबएप का उपयोग कर रहे हैं और यदि आप क्लाइंट को हड़पना चाहते हैं (एक जो ब्राउज़र के माध्यम से अनुरोध करता है) बाहरी आईपी एक सार्वजनिक डोमेन में ऐप को तैनात करने का प्रयास करता है और बाहरी आईपी पते को पढ़ने के लिए request.getRemoteAddr () का उपयोग करता है।



0

एक वैकल्पिक समाधान एक बाहरी कमांड को निष्पादित करना है, जाहिर है, यह समाधान एप्लिकेशन की पोर्टेबिलिटी को सीमित करता है।

उदाहरण के लिए, विंडोज पर चलने वाले एप्लिकेशन के लिए, PowerShell कमांड को jPowershell के माध्यम से निष्पादित किया जा सकता है, जैसा कि निम्नलिखित कोड में दिखाया गया है:

public String getMyPublicIp() {
    // PowerShell command
    String command = "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()";
    String powerShellOut = PowerShell.executeSingleCommand(command).getCommandOutput();

    // Connection failed
    if (powerShellOut.contains("InvalidOperation")) {
        powerShellOut = null;
    }
    return powerShellOut;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.