জাভাতে 'বাহ্যিক' আইপি ঠিকানা প্রাপ্তি


84

কোনও নেটওয়ার্কের বাইরের কম্পিউটার হিসাবে মেশিনের বহিরাগত আইপি অ্যাড্রেসটি কীভাবে পাওয়া যাবে সে সম্পর্কে আমি খুব নিশ্চিত নই।

আমার নিম্নলিখিত আইপিএড্রেস ক্লাসটি কেবল মেশিনের স্থানীয় আইপি ঠিকানা পায়।

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;
    }
}

14
আপনি জানেন যে একটি মেশিনে একবারে অনেকগুলি পাবলিক ঠিকানা থাকতে পারে? তারা সত্যই কোনও মেশিন নয়, একটি নেটওয়ার্ক ইন্টারফেসের সাথে যুক্ত associated
ডোনাল ফেলো 30'10

উত্তর:


169

আমি নিশ্চিত নই যে আপনি লোকাল মেশিনে চালিত কোড থেকে সেই আইপিটি ধরতে পারবেন কিনা।

তবে আপনি কোনও ওয়েবসাইট যা চলমান কোড তৈরি করতে পারেন, জেএসপিতে বলুন এবং তারপরে এমন কিছু ব্যবহার করুন যা অনুরোধটি এসেছে যেখানে আইপি ফিরে আসে:

request.getRemoteAddr()

অথবা কেবল ইতিমধ্যে বিদ্যমান পরিষেবাগুলি ব্যবহার করুন যা এটি করে, তারপরে আইপি সন্ধানের জন্য পরিষেবাটি থেকে উত্তরটি পার্স করুন।

এডাব্লুএস এবং অন্যদের মতো একটি ওয়েবসার্ভিস ব্যবহার করুন

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- এ স্থায়ী থাকেন automation.whatismyip.com/n09230945.asp
thegrinner

8
আমি কমপক্ষে দুটি সার্ভার প্রয়োগ করার পরামর্শ দেব যা আপনার আইপি পরিবেশন করে, যদি তাদের মধ্যে একটি মুহুর্তে নিচে থাকে (অবশ্যই সঠিক ত্রুটি পরিচালনা করে) আমার choise হবে externalip.net (ক্লিক লিঙ্ক "একটি API প্রয়োজন?")। এক বছর ধরে সেই সাইটটি ভাল ব্যবহার করে চলেছে, এখন পর্যন্ত কোনও সমস্যা হয়নি এবং এটি একটি দ্রুত পরিষেবা যা সর্বদা দ্রুত প্রতিক্রিয়া ফিরিয়ে দেয়।

দুর্দান্ত লিংক; আমি একটি বিশ্ববিদ্যালয়ের নেটওয়ার্কিং অ্যাসাইনমেন্টে ধারণার প্রমাণের অংশ হিসাবে এটি ব্যবহার করব!
অ্যারাইসবেক

অন্য বিকল্পটি হ'ল যদি আপনার কোনও ওয়েব সার্ভার বা হোস্ট অ্যাকাউন্টে অ্যাক্সেস থাকে যা পিএইচপি চালায় কেবল উপরের প্রদত্ত কোডটি @ বক্কল ব্যবহার করে এবং আপনার নিজের পিএইচপি ফাইলটিতে এটি নির্দেশ করে যা কেবল থাকে echo $_SERVER['REMOTE_ADDR'];। যদি স্ক্রিপ্টটির একমাত্র বা প্রথম আউটপুট লাইনটি আপনি সেট করেন।
কিংসোলমনে

7
Whatsmyip.com আর এই ধরণের অটোমেশনটিকে আর সমর্থন করে না বলে মনে হয়।
কিংসোলমনে

79

@ স্টিভ্লোর দেওয়া মন্তব্যের একটি উত্তর হওয়ার যোগ্য:

আপনি আমাজন পরিষেবাটি 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 বাক্সটি কীভাবে বাহ্যিক থেকে অভ্যন্তরীণ IP ঠিকানাগুলিতে ম্যাপিং করছে তা আপনার মেশিনের কার্নেলের পক্ষে কোনও উপায় নেই। অন্যান্য উত্তর এখানে বাইরের ওয়েবসাইটে কথা বলার পদ্ধতি জড়িত কৌশল সরবরাহ করে।


4
বা না, যেমন এটি আসল প্রশ্নের উত্তর দেয় না, এবং এটি একাডেমিক অনুশীলনের মতো দেখাচ্ছে
ব্রুনো বোসোলা

নিখুঁতভাবে, এই উত্তরটি প্রশ্নের উত্তর দেয় এবং অন্যান্য ডজন উত্তরগুলি মূলত একই কথা বলে তবে বহিরাগত আইপি চেকারের কোনও পছন্দমত নির্দিষ্ট কোড বা URL গুলি দেখায় show
থমাস

14

এগুলি এখনও চলছে এবং সহজেই কাজ করছে! (23 সেপ্টেম্বর 2019 হিসাবে)

পরামর্শের টুকরো: কেবলমাত্র তাদের মধ্যে একটির উপর সরাসরি নির্ভর করবেন না; একটি ব্যবহার করার চেষ্টা করুন তবে অন্যদের বিবেচনা করে একটি আধ্যাত্মিক পরিকল্পনা করুন! আপনি যত বেশি ব্যবহার করবেন তত ভাল!

শুভকামনা!


12

@ ডোনাল ফেলো যেমন লিখেছেন, আপনাকে মেশিনের পরিবর্তে নেটওয়ার্ক ইন্টারফেসটি জিজ্ঞাসা করতে হবে। জাভাডোকের এই কোডটি আমার পক্ষে কাজ করেছিল:

নিম্নলিখিত উদাহরণস্বরূপ প্রোগ্রামটি একটি মেশিনে সমস্ত নেটওয়ার্ক ইন্টারফেস এবং তাদের ঠিকানাগুলি তালিকাভুক্ত করে:

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 থেকে


4
ধন্যবাদ! এই সফ্টওয়্যারটি যখন কোনও NAT এর পিছনে থাকে তখন এই সমাধানটি কার্যকর হয় না, তবে এটি সার্ভার সফ্টওয়্যারটির জন্য খুব কার্যকর যে আপনি জানেন যে কোনও NAT এর পিছনে থাকবে না, বা যদি একটি সফটওয়্যার অন্য কোনও সার্ভারের সাথে নিজস্ব হওয়ার জন্য সংযুক্ত না করতে পারে তবে ফলব্যাক হিসাবে আইপি বিশেষত ল্যানগুলি ইন্টারনেট থেকে সংযোগ বিচ্ছিন্ন করার উদ্দেশ্যে সফ্টওয়্যারগুলির জন্য, এটি যাওয়ার উপায় go
প্যাভন

6

Www.whatismyip.com এর মতো কিছু সাইটে একটি HTTPURL সংযোগ তৈরি করুন এবং পার্স করুন :-)


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/ এটি করবে - যদি আপনার গেটওয়ে ডিভাইসটি স্টান না করে তবে) বেশিরভাগ ক্ষেত্রেই)


4
বেশ আকর্ষণীয়, এটি বাহ্যিক পরিষেবা ব্যবহার না করে কেবল গেটওয়েতে কথা বলা ছাড়া প্রত্যাশার মতো কাজ করে। জিপিএল লাইসেন্স সম্ভবত এটি গ্রহণের ক্ষেত্রে সীমাবদ্ধ করবে।
ব্রুনো বোসোলা

সাইটটি আমাকে একটি লগইন স্ক্রিন দিচ্ছে। সম্ভবত আসল নয়।
Jus12

1

এটি এত সহজ নয় যেহেতু ল্যানের অভ্যন্তরে কোনও মেশিন সাধারণত তার রাউটারের বাইরের আইপি ইন্টারনেটে যত্ন করে না .. এটির কেবল এটির প্রয়োজন হয় না!

আমি আপনাকে http://www. व्हाइटস্মিআইপি.com / এর মতো সাইট খোলার মাধ্যমে এবং এইচটিএমএল ফলাফলগুলি বিশ্লেষণ করে আইপি নম্বর পেয়ে এটি কাজে লাগানোর পরামর্শ দিচ্ছি .. এটি এত শক্ত হওয়া উচিত নয়!


4
আপনাকে এইচটিএমএল বিশ্লেষণ করতে হবে না। হোয়াটস্মিআইপি ডটকমের ওয়েবপেজ উত্সের প্রথম লাইনটি আপনার বাহ্যিক আইপি।
মার্টিজন কোর্টেক্স

0

আপনি যদি জাএভিএ ভিত্তিক ওয়েব অ্যাপ ব্যবহার করছেন এবং আপনি যদি ক্লায়েন্টের (যিনি ব্রাউজারের মাধ্যমে অনুরোধ করেন) ধরে ফেলতে চান তবে বহিরাগত আইপি অ্যাপ্লিকেশনটিকে একটি সর্বজনীন ডোমেনে স্থাপন করার চেষ্টা করুন এবং বাহ্যিক আইপি ঠিকানাটি পড়তে অনুরোধ.getRemoteAddr () ব্যবহার করুন।



0

একটি বিকল্প সমাধান হ'ল বাহ্যিক কমান্ড কার্যকর করা, স্পষ্টতই, এই সমাধান অ্যাপ্লিকেশনটির বহনযোগ্যতা সীমাবদ্ধ করে।

উদাহরণস্বরূপ, উইন্ডোজে চলমান একটি অ্যাপ্লিকেশনটির জন্য, পাওয়ারশেল কমান্ড 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.