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


291

আমি এমন একটি সিস্টেম বিকাশের চেষ্টা করছি যেখানে বিভিন্ন সিস্টেমে বা একই সিস্টেমে বিভিন্ন পোর্টে চালিত বিভিন্ন নোড রয়েছে।

এখন সমস্ত নোড বুটস্ট্র্যাপিং নোড হিসাবে পরিচিত একটি বিশেষ নোডের আইপি হিসাবে লক্ষ্য আইপি সহ একটি সকেট তৈরি করে। নোডগুলি এর পরে তাদের নিজস্ব তৈরি করে ServerSocketএবং সংযোগগুলির জন্য শুনতে শুরু করে।

বুটস্ট্র্যাপিং নোড নোডের একটি তালিকা বজায় রাখে এবং জিজ্ঞাসাবাদে এগুলি প্রদান করে।

এখন আমার যা দরকার তা হ'ল নোডকে অবশ্যই তার আইপিটি বুটস্ট্র্যাপিং নোডে নিবন্ধভুক্ত করতে হবে। cli.getInetAddress()ক্লায়েন্ট একবার ServerSocketবুটস্ট্র্যাপিং নোডের সাথে সংযোগ স্থাপন করার চেষ্টা করেছি তবে এটি কার্যকর হয়নি।

  1. আমার যদি ক্লায়েন্টের পিপিপি আইপি উপলব্ধ থাকে তবে তা রেজিস্টার করতে হবে;
  2. অন্যথায় ল্যান আইপি যদি পাওয়া যায়;
  3. অন্যথায় এটি অবশ্যই একই কম্পিউটার ধরে 127.0.0.1 রেজিস্ট্রেশন করতে হবে।

কোড ব্যবহার করে:

System.out.println(Inet4Address.getLocalHost().getHostAddress());

অথবা

System.out.println(InetAddress.getLocalHost().getHostAddress());

আমার পিপিপি সংযোগ আইপি ঠিকানা: 117.204.44.192 তবে উপরেরটি আমাকে 192.168.1.2 প্রদান করে

সম্পাদনা

আমি নিম্নলিখিত কোড ব্যবহার করছি:

Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
    NetworkInterface n = (NetworkInterface) e.nextElement();
    Enumeration ee = n.getInetAddresses();
    while (ee.hasMoreElements())
    {
        InetAddress i = (InetAddress) ee.nextElement();
        System.out.println(i.getHostAddress());
    }
}

আমি সমস্ত আইপি অ্যাড্রেসগুলি সমস্ত সংযুক্ত করতে সক্ষম হয়েছি NetworkInterface, তবে আমি কীভাবে সেগুলি আলাদা করব? এই আউটপুট আমি পাচ্ছি:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19

Inet4Address.getLocalHost () ঠিক কাজ করা উচিত?
সিয়ার্স ভারত

3
লুপটির অভ্যন্তরে যদি আমি n.isPointToPoint () যুক্ত করি তা কি কাজ করবে ?? আমার ধারণাটি যদি "127.0.0.1" ফিরে আসে তবে যদি কোনও পয়েন্ট টু পয়েন্ট নেটওয়ার্ক না পাওয়া যায়। কাজ হবে ??
শশীধর

3
@ সাসিধর: দয়া করে আপনার আসল আইপি ঠিকানা পোস্ট করবেন না। 117.xxx.xxx.xxx লিখুন, ব্যক্তিগত আইপি জন্য এটি ঠিক আছে।
nIcE cww

@ গগনদীপবালি পরামর্শের জন্য ধন্যবাদ তবে আমার আইপি একটি গতিশীল আইপি এবং আমি যখনই আমার ইন্টারনেট সংযোগ বিচ্ছিন্ন ও সংযুক্ত করি তখনই আমি একটি নতুন আইপি পাই। আমার মনে হয় তাই সমস্যা হওয়া উচিত নয়।
শশীধর

উত্তর:


115
import java.net.DatagramSocket;
import java.net.InetAddress;

try(final DatagramSocket socket = new DatagramSocket()){
  socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
  ip = socket.getLocalAddress().getHostAddress();
}

একাধিক নেটওয়ার্ক ইন্টারফেস থাকলে এই পদ্ধতিটি ভালভাবে কাজ করে। এটি সর্বদা পছন্দসই আউটবাউন্ড আইপি প্রদান করে। গন্তব্যটি পৌঁছানোর 8.8.8.8দরকার নেই not

Connectকোনও ইউডিপি সকেটের উপর নিম্নলিখিত প্রভাব রয়েছে: এটি প্রেরণ / রেসিভের জন্য গন্তব্য নির্ধারণ করে, অন্যান্য ঠিকানা থেকে সমস্ত প্যাকেট বাতিল করে এবং - যা আমরা ব্যবহার করি - সকেটটিকে "সংযুক্ত" অবস্থায় স্থানান্তরিত করে, তার উপযুক্ত ক্ষেত্রগুলি সেটিংস করে। এর মধ্যে রয়েছে সিস্টেমের রাউটিং টেবিল অনুসারে গন্তব্যের পথে রুটের অস্তিত্ব পরীক্ষা করা এবং সেই অনুযায়ী স্থানীয় শেষ পয়েন্টটি নির্ধারণ করা। শেষ অংশটি আনুষ্ঠানিকভাবে আনুষ্ঠানিকভাবে বলে মনে হচ্ছে তবে এটি বার্কলে সকেটস এপিআইয়ের একটি অবিচ্ছেদ্য বৈশিষ্ট্যের মতো (ইউডিপি "সংযুক্ত" রাষ্ট্রের একটি পার্শ্ব প্রতিক্রিয়া) যা সংস্করণ এবং বিতরণ জুড়ে উইন্ডোজ এবং লিনাক্স উভয় ক্ষেত্রে নির্ভরযোগ্যভাবে কাজ করে।

সুতরাং, এই পদ্ধতিটি স্থানীয় ঠিকানা দেবে যা নির্দিষ্ট দূরবর্তী হোস্টের সাথে সংযোগ করতে ব্যবহৃত হবে। সত্যিকারের সংযোগ স্থাপন করা হয়নি, সুতরাং নির্দিষ্ট দূরবর্তী আইপিটি অ্যাক্সেসযোগ্য হতে পারে।

সম্পাদনা:

যেমন @ ম্যাকগিগিল বলেছেন, ম্যাকওএসের জন্য আপনি এটি করতে পারেন:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());

7
এটি আমার জন্য লিনাক্সে কাজ করেছে তবে ওএসএক্সে আমি পেয়েছি: "0.0.0.0"
রাদু টডার

@ জিফ, উত্তর আপডেট হয়েছে। যদি এটি ওএসএক্সে কাজ না করে, তবে আপনাকে অন্য কোনও উপায় বাছাই করতে হবে।
মিস্টার ওয়াং পরের দরজা 20'18

1
উজ্জ্বল! এফওয়াইআই, বন্ধ অভ্যন্তরীণ নেটওয়ার্কের সাথে কাজ করার সময়, প্রতিটি হোস্টের কাছে পৌঁছতে পারে এমন কিছু দিয়ে কেবল 8.8.8.8 প্রতিস্থাপন করুন
মারফি এনজি

উইন্ডোজে কাজ করে; ওএসএক্স এখনও সমস্যা আছে কিনা তা আমরা নিশ্চিত করতে পারি?
ট্রিলজি

4
@ তাত্ত্বিক আমি এখনও ওএসএক্সে 0.0.0.0
পাচ্ছি

273

সর্বাধিক সাধারণ ক্ষেত্রে এটি কিছুটা জটিল হতে পারে।

এর মুখে InetAddress.getLocalHost()আপনাকে এই হোস্টের আইপি ঠিকানা দেওয়া উচিত। সমস্যাটি হ'ল কোনও হোস্টের প্রচুর নেটওয়ার্ক ইন্টারফেস থাকতে পারে এবং একটি ইন্টারফেস একাধিক আইপি ঠিকানার সাথে আবদ্ধ হতে পারে। এবং সর্বোপরি, সমস্ত আইপি ঠিকানাগুলি আপনার মেশিন বা ল্যানের বাইরে পৌঁছনীয় নয়। উদাহরণস্বরূপ, এগুলি ভার্চুয়াল নেটওয়ার্ক ডিভাইসগুলির জন্য আইপি ঠিকানা হতে পারে, ব্যক্তিগত নেটওয়ার্কের আইপি ঠিকানা এবং আরও অনেক কিছু।

এর অর্থ হ'ল যে আইপি ঠিকানাটি ফিরে এসেছে InetAddress.getLocalHost()তা ব্যবহারের জন্য সঠিক নাও হতে পারে।

আপনি কিভাবে এটি মোকাবেলা করতে পারেন?

  • NetworkInterface.getNetworkInterfaces()হোস্টে পরিচিত সমস্ত নেটওয়ার্ক ইন্টারফেস পাওয়ার জন্য একটি পদ্ধতিকে ব্যবহার করা এবং তারপরে প্রতিটি এনআই এর ঠিকানাগুলি পুনরাবৃত্তি করতে হবে।
  • অন্য পদ্ধতিটি হল (কোনওভাবে) হোস্টের জন্য বাহ্যিকভাবে অ্যাডভার্টাইজড এফকিউডিএন পাওয়া, এবং InetAddress.getByName()প্রাথমিক আইপি ঠিকানাটি সন্ধান করার জন্য ব্যবহার করা use (তবে আপনি এটি কীভাবে পাবেন এবং আপনি ডিএনএস-ভিত্তিক লোড ব্যালান্সারের সাথে কীভাবে व्यवहार করবেন?)
  • পূর্ববর্তীগুলির একটি প্রকরণ হ'ল একটি কনফিগার ফাইল বা কমান্ড লাইন প্যারামিটার থেকে পছন্দের FQDN পাওয়া।
  • আর একটি ভিন্নতা হ'ল একটি কনফিগার ফাইল বা কমান্ড লাইন প্যারামিটার থেকে পছন্দের আইপি ঠিকানাটি পাওয়া।

সংক্ষেপে, InetAddress.getLocalHost()সাধারণত কাজ করবে, তবে আপনার কোডগুলি "জটিল" নেটওয়ার্কিংয়ের সাথে একটি পরিবেশে চালিত হয় সেগুলির জন্য আপনার একটি বিকল্প পদ্ধতি সরবরাহের প্রয়োজন হতে পারে।


আমি সমস্ত নেটওয়ার্ক ইন্টারফেসের সাথে সম্পর্কিত সমস্ত আইপি ঠিকানা পেতে সক্ষম হয়েছি, তবে আমি কীভাবে সেগুলি আলাদা করব?

  • 127.xxx.xxx.xxx পরিসরের কোনও ঠিকানা একটি "লুপব্যাক" ঠিকানা। এটি কেবল "এই" হোস্টের জন্য দৃশ্যমান।
  • 192.168.xxx.xxx পরিসরের কোনও ঠিকানা একটি ব্যক্তিগত (ওরফে সাইট স্থানীয়) আইপি ঠিকানা। এগুলি কোনও সংস্থার মধ্যে ব্যবহারের জন্য সংরক্ষিত। এটি একইভাবে প্রযোজ্য १०.০.এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স এবং 172.16.xxx.xxx এর মাধ্যমে 172.31.xxx.xxx।
  • 169.254.xxx.xxx পরিসরের ঠিকানাগুলি স্থানীয় আইপি ঠিকানার লিঙ্ক। এগুলি একক নেটওয়ার্ক বিভাগে ব্যবহারের জন্য সংরক্ষিত।
  • 229.xxx.xxx.xxx 239.xxx.xxx.xxx এর মধ্যে সীমাতে ঠিকানাগুলি মাল্টিকাস্ট ঠিকানা।
  • 255.255.255.255 ঠিকানাটি সম্প্রচারের ঠিকানা।
  • আর কিছু করা উচিত নয় একটি বৈধ প্রকাশ্য পয়েন্ট-টু-পয়েন্ট IPv4 ঠিকানা হও।

প্রকৃতপক্ষে, ইনটএড্রেস এপিআই লুপব্যাক, লিংক স্থানীয়, সাইট স্থানীয়, মাল্টিকাস্ট এবং সম্প্রচারের ঠিকানাগুলির জন্য পরীক্ষার জন্য পদ্ধতি সরবরাহ করে। আপনি যে আইপি ঠিকানাগুলি ফিরিয়ে আনবেন সেগুলির মধ্যে কোনটি সর্বাধিক উপযুক্ত তা বাছাই করতে আপনি এগুলি ব্যবহার করতে পারেন।


3
যদি কেউ কৌতূহলী হন তবে getLocalHost মূলত সার্ভারের হোস্টনেমায় একটি ডিএনএস লুক্কুট করে। যদি এটি সেই অনুসন্ধান থেকে কোনও আইপি ঠিকানা পায় তবে এটি কোন ইন্টারফেসের আইপি ঠিকানা রয়েছে তা দেখার জন্য এটি উপলব্ধ ইন্টারফেসগুলির মাধ্যমে অনুসন্ধান করে এবং এটি সেই ইন্টারফেসটি ফিরিয়ে দেয়। এর অর্থ getLocalHost "সার্ভার" পরিবেশে কাজ করার প্রবণতা রাখবে যেখানে বহির্গামী আইপি হ'ল এটি সার্ভারের হোস্ট-নেম ম্যাপ করে।
পেস

1
উবুন্টু 14.04-এ এই এপিআই 127.0.1.1 প্রদান করে, যদিও আইফনফিগ কেবল দুটি ইন্টারফেসের প্রতিবেদন করে, একটি আমি চাই (সর্বজনীনভাবে প্রবেশযোগ্য আইপি ঠিকানা) এবং লুপব্যাক (127.0.0.1)। অদ্ভুত যে এটি একটি পৃথক লুপব্যাক ওরফে দেয়।
সিটিপেনরোজ

আমি এটি যুক্ত করব যদি আপনি use getLocalHost().getHostAddress()কিছু প্রকাশ করতে চান তবে আপনি 0.0.0.0নেটওয়ার্কে কোনও নটর কম্পিউটার থেকে সন্ধান করার সময় দেখতে পাবেন । এই ব্যাখ্যা করা হয় এখানে এই যখন আমি ব্যবহার করছিলেন আমাকে কি ঘটেছে গাজেবো দুই কম্পিউটারগুলি জুড়ে
পিটার Mitrano

57

এখানে পোস্ট করা https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () লিনাক্স সিস্টেমে অস্পষ্ট) থেকে আইপি অস্পষ্টতা কাজের কোডটি পরীক্ষিত হয়েছে :

/**
 * Returns an <code>InetAddress</code> object encapsulating what is most likely the machine's LAN IP address.
 * <p/>
 * This method is intended for use as a replacement of JDK method <code>InetAddress.getLocalHost</code>, because
 * that method is ambiguous on Linux systems. Linux systems enumerate the loopback network interface the same
 * way as regular LAN network interfaces, but the JDK <code>InetAddress.getLocalHost</code> method does not
 * specify the algorithm used to select the address returned under such circumstances, and will often return the
 * loopback address, which is not valid for network communication. Details
 * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4665037">here</a>.
 * <p/>
 * This method will scan all IP addresses on all network interfaces on the host machine to determine the IP address
 * most likely to be the machine's LAN address. If the machine has multiple IP addresses, this method will prefer
 * a site-local IP address (e.g. 192.168.x.x or 10.10.x.x, usually IPv4) if the machine has one (and will return the
 * first site-local address if the machine has more than one), but if the machine does not hold a site-local
 * address, this method will return simply the first non-loopback address found (IPv4 or IPv6).
 * <p/>
 * If this method cannot find a non-loopback address using this selection algorithm, it will fall back to
 * calling and returning the result of JDK method <code>InetAddress.getLocalHost</code>.
 * <p/>
 *
 * @throws UnknownHostException If the LAN address of the machine cannot be found.
 */
private static InetAddress getLocalHostLANAddress() throws UnknownHostException {
    try {
        InetAddress candidateAddress = null;
        // Iterate all NICs (network interface cards)...
        for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
            NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
            // Iterate all IP addresses assigned to each card...
            for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
                InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
                if (!inetAddr.isLoopbackAddress()) {

                    if (inetAddr.isSiteLocalAddress()) {
                        // Found non-loopback site-local address. Return it immediately...
                        return inetAddr;
                    }
                    else if (candidateAddress == null) {
                        // Found non-loopback address, but not necessarily site-local.
                        // Store it as a candidate to be returned if site-local address is not subsequently found...
                        candidateAddress = inetAddr;
                        // Note that we don't repeatedly assign non-loopback non-site-local addresses as candidates,
                        // only the first. For subsequent iterations, candidate will be non-null.
                    }
                }
            }
        }
        if (candidateAddress != null) {
            // We did not find a site-local address, but we found some other non-loopback address.
            // Server might have a non-site-local address assigned to its NIC (or it might be running
            // IPv6 which deprecates the "site-local" concept).
            // Return this non-loopback candidate address...
            return candidateAddress;
        }
        // At this point, we did not find a non-loopback address.
        // Fall back to returning whatever InetAddress.getLocalHost() returns...
        InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
        if (jdkSuppliedAddress == null) {
            throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
        }
        return jdkSuppliedAddress;
    }
    catch (Exception e) {
        UnknownHostException unknownHostException = new UnknownHostException("Failed to determine LAN address: " + e);
        unknownHostException.initCause(e);
        throw unknownHostException;
    }
}

6
এটি অবশ্যই লক্ষ রাখতে হবে যে হোস্টের একাধিক অনুরূপ নার্ভের ইন্টারফেস রয়েছে সে ক্ষেত্রে এটি অস্পষ্টতার সমাধান করে না।
ভাদজিম

1
নিচে উত্তর উত্তম - stackoverflow.com/questions/9481865/... স্থানীয় IP ঠিকানা ডিফল্ট Gatway জন্য src হিসেবে ব্যবহার করা হয় পায়
Radu Toader

সামনের স্ল্যাশের সাথে আইপি ঠিকানা যুক্ত করা হয় কেন ..? /10.39.0.17 এর মত ..?, এটি কি সবসময় এইভাবে ছাঁটাই করা উচিত ..?
কানাগাভেলু সুগুমার

51

আপনি এই উদ্দেশ্যে জাভা এর ইনটএড্রেস ক্লাস ব্যবহার করতে পারেন ।

InetAddress IP=InetAddress.getLocalHost();
System.out.println("IP of my system is := "+IP.getHostAddress());

আমার সিস্টেমের জন্য আউটপুট = IP of my system is := 10.100.98.228

getHostAddress () আয়

পাঠ্য উপস্থাপনায় আইপি ঠিকানার স্ট্রিং প্রদান করে।

অথবা আপনি করতে পারেন

InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.toString());

আউটপুট = IP of my system is := RanRag-PC/10.100.98.228


9
মনে রাখবেন যে 10.xxx একটি ব্যক্তিগত ঠিকানা, এটি নির্দেশ করে যে আপনার সিস্টেমটি একটি নেট নেটওয়ার্কে রয়েছে। বাইরের বিশ্বের সাথে যোগাযোগ করার সময় এটি আলাদা ঠিকানা হিসাবে উপস্থিত হবে। যদি আপনার সত্যিকারের বাহ্যিক আইপি ঠিকানা প্রয়োজন হয় তবে আপনাকে অনেকগুলি সাইটের একটিতে যোগাযোগ করতে হবে যা আপনি যে আইপি ঠিকানা থেকে এসেছেন তা প্রতিধ্বনি করবে। এটি আপনার পক্ষে দরকারী বা নাও হতে পারে। আপনার সিস্টেমটি অবশ্যই কোনও ইভেন্টে বাইরে থেকে পৌঁছনীয় নয়।
এডওয়ার্ড ফ্যালক

19

আপনি যখন নিজের "স্থানীয়" ঠিকানাটি সন্ধান করছেন, আপনার অবশ্যই লক্ষ্য করা উচিত যে প্রতিটি মেশিনের কেবল একটি একক নেটওয়ার্ক ইন্টারফেস নেই, এবং প্রতিটি ইন্টারফেসের নিজস্ব স্থানীয় ঠিকানা থাকতে পারে। যার অর্থ আপনার মেশিন সর্বদা বেশ কয়েকটি "স্থানীয়" ঠিকানাগুলির মালিকানাধীন।

আপনি যখন বিভিন্ন শেষ পয়েন্টগুলিতে সংযোগ করছেন তখন বিভিন্ন "স্থানীয়" ঠিকানাগুলি স্বয়ংক্রিয়ভাবে ব্যবহার করতে বেছে নেওয়া হবে। উদাহরণস্বরূপ, আপনি যখন সংযুক্ত হন google.com, আপনি একটি "বাইরের" স্থানীয় ঠিকানা ব্যবহার করছেন; তবে আপনি যখন আপনার সাথে সংযুক্ত হন localhost, আপনার স্থানীয় ঠিকানা সর্বদা থাকেlocalhost নিজেই থাকে কারণ লোকালহোস্টটি কেবল একটি লুপব্যাক।

আপনি যখন যোগাযোগ করছেন তখন নীচের অংশে কীভাবে আপনার স্থানীয় ঠিকানা সন্ধান করবেন google.com:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());

অসাধারণ !! - এত সহজ :)
স্মাইলফেস

4
শেষে skket.close () যুক্ত করুন :)
এমসি

11

স্কালায় উদাহরণ (এসবিটি ফাইলে দরকারী):

  import collection.JavaConverters._
  import java.net._

  def getIpAddress: String = {

    val enumeration = NetworkInterface.getNetworkInterfaces.asScala.toSeq

    val ipAddresses = enumeration.flatMap(p =>
      p.getInetAddresses.asScala.toSeq
    )

    val address = ipAddresses.find { address =>
      val host = address.getHostAddress
      host.contains(".") && !address.isLoopbackAddress
    }.getOrElse(InetAddress.getLocalHost)

    address.getHostAddress
  }

10

সম্পাদনা 1: পূর্ববর্তী লিঙ্কটি থেকে আপডেট করা কোড, আর নেই

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

public class GetMyIP {
    public static void main(String[] args) {
        URL url = null;
        BufferedReader in = null;
        String ipAddress = "";
        try {
            url = new URL("http://bot.whatismyipaddress.com");
            in = new BufferedReader(new InputStreamReader(url.openStream()));
            ipAddress = in.readLine().trim();
            /* IF not connected to internet, then
             * the above code will return one empty
             * String, we can check it's length and
             * if length is not greater than zero, 
             * then we can go for LAN IP or Local IP
             * or PRIVATE IP
             */
            if (!(ipAddress.length() > 0)) {
                try {
                    InetAddress ip = InetAddress.getLocalHost();
                    System.out.println((ip.getHostAddress()).trim());
                    ipAddress = (ip.getHostAddress()).trim();
                } catch(Exception exp) {
                    ipAddress = "ERROR";
                }
            }
        } catch (Exception ex) {
            // This try will give the Private IP of the Host.
            try {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                ipAddress = (ip.getHostAddress()).trim();
            } catch(Exception exp) {
                ipAddress = "ERROR";
            }
            //ex.printStackTrace();
        }
        System.out.println("IP Address: " + ipAddress);
    }
}

বাস্তব সংস্করণ: এটি কাজ করা বন্ধ করে দিয়েছে

আশা করি এই স্নিপেট আপনাকে এটি অর্জনে সহায়তা করতে পারে:

// Method to get the IP Address of the Host.
private String getIP()
{
    // This try will give the Public IP Address of the Host.
    try
    {
        URL url = new URL("http://automation.whatismyip.com/n09230945.asp");
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String ipAddress = new String();
        ipAddress = (in.readLine()).trim();
        /* IF not connected to internet, then
         * the above code will return one empty
         * String, we can check it's length and
         * if length is not greater than zero, 
         * then we can go for LAN IP or Local IP
         * or PRIVATE IP
         */
        if (!(ipAddress.length() > 0))
        {
            try
            {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                return ((ip.getHostAddress()).trim());
            }
            catch(Exception ex)
            {
                return "ERROR";
            }
        }
        System.out.println("IP Address is : " + ipAddress);

        return (ipAddress);
    }
    catch(Exception e)
    {
        // This try will give the Private IP of the Host.
        try
        {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println((ip.getHostAddress()).trim());
            return ((ip.getHostAddress()).trim());
        }
        catch(Exception ex)
        {
            return "ERROR";
        }
    }
}

2
সমাধানটি কার্যকর হবে, আশা করি যদি আমি সর্বদা ইন্টারনেটে সংযুক্ত থাকি তবে আমার এটির নিশ্চয়তা নেই। এছাড়াও, যখন সিস্টেমটি ইন্টারনেটের সাথে সংযুক্ত থাকে না এবং তারপরে আমাকে সিস্টেমের ল্যান আইপি ঠিকানাটি ফেরত দিতে হবে, অন্যথায় লোকালহোস্ট। সুতরাং আমার জন্য সম্ভাব্য বিকল্প নয়। অন্য কোন উপায়??
শশীধর

@ সসিধর: আপনি যখন ইন্টারনেটে সংযুক্ত থাকেন, কেবল তখনই আপনি আপনার পাবলিক আইপি অনুমান করেন, আপনি যদি সংযুক্ত না হন তবে এই পদ্ধতিটি আপনাকে, আপনার স্থানীয় আইপি বা ল্যান আইপি এবং আপনার দ্বারা বর্ণিত শেষ অবস্থার জন্য দেবে ত্রুটি ফিরে আসার পরিবর্তে আপনি "127.0.0.1" ফিরে আসতে পারেন।
nIcE cww

1
আমি আপনার অ্যাপ্রোচ পছন্দ করি কিন্তু সেই লিঙ্কটি আর কাজ করবে না বলে মনে হচ্ছে !! আমি কি বাহ্যিক লিঙ্কের পরিবর্তে কাজ করার জন্য নিজের সিস্টেমে একটি নিয়ামক রাখতে পারি এবং তাই আরও নির্ভরযোগ্য হতে পারি ???
আজেফরাতি

1
@ ব্লুড্রাইম: আমার জ্ঞান এনে দেওয়ার জন্য থ্যাঙ্কয়ু এতটা, যে লিঙ্কটি আর কাজ করছে না। আমি কিছু নতুন ইনপুট সহ পোস্টটি আপডেট করেছি। আশা করি এটি আপনার ব্যবহারকারীর পক্ষে কাজ করে। আপনার প্রশ্ন সম্পর্কে, আমি সত্যিই জানি না, কীভাবে আপনার নিজের সিস্টেমে এটির কাজ করতে একটি কন্ট্রোলার সেটআপ করবেন। সুতরাং আমি এই বিষয়টিতে অন্তর্দৃষ্টি দিতে সক্ষম হব না, আমার বাড। আবার ধন্যবাদ এবং
স্মিলিং কে

1
এটি যতই শীতল সমাধান, এটি অত্যন্ত বিশ্বাসযোগ্য নয়। যদি আপনি মূল থ্রেডটি অবরুদ্ধ করেন (যাক বলে দিন) এবং যে কোনও কারণেই whatismyip.comকিছু সময়ের জন্য ডাউন ছিল, আপনার অ্যাপ্লিকেশনটিও নীচে নেমে আসবে :( বা এটি আবর্জনার ডেটা ফেরত দেবে এবং অপ্রত্যাশিত আচরণের কারণ ঘটবে Also এছাড়াও, এটি বাহ্যিককে ফেরত দেয়) সবচেয়ে IP ঠিকানা নির্ধারণযোগ্য whatismyip.comনা অগত্যা মেশিনের IP ঠিকানা আপনি ব্যবহার করছেন।
সঙ্কেতমুক্ত

6

প্রথমত ক্লাসটি আমদানি করুন

import java.net.InetAddress;

ক্লাসে

  InetAddress iAddress = InetAddress.getLocalHost();
  String currentIp = iAddress.getHostAddress();
  System.out.println("Current IP address : " +currentIp); //gives only host address

2
এটি কেবলমাত্র প্রথম আইপি ঠিকানা দেয় এমনকি এটি ব্যবহারের ক্ষেত্রে না থাকলেও!
ইয়াহিয়া

6

আপনি java.net.InetAddressএপিআই ব্যবহার করতে পারেন । এটা চেষ্টা কর :

InetAddress.getLocalHost().getHostAddress();

5
এটি কেবল 127.0.0.1 এ ফিরে আসবে
এইচক্রারস্কো

5
private static InetAddress getLocalAddress(){
        try {
            Enumeration<NetworkInterface> b = NetworkInterface.getNetworkInterfaces();
            while( b.hasMoreElements()){
                for ( InterfaceAddress f : b.nextElement().getInterfaceAddresses())
                    if ( f.getAddress().isSiteLocalAddress())
                        return f.getAddress();
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return null;
    }

1
দয়া করে আপনার কোড কী করবে সে সম্পর্কে কিছু ব্যাখ্যা যুক্ত করার বিষয়টি বিবেচনা করুন।
এইচক্রারস্কো

4

এটি উপরের স্বীকৃত উত্তরের একটি কার্যকারী উদাহরণ! এই নেটআইডেন্টিটি ক্লাসটি অভ্যন্তরীণ হোস্ট আইপি, পাশাপাশি স্থানীয় লুপব্যাক উভয়ই সঞ্চয় করবে। আপনি যদি উপরে উল্লিখিত হিসাবে কোনও ডিএনএস ভিত্তিক সার্ভারে থাকেন তবে আপনাকে আরও কয়েকটি চেক যুক্ত করতে বা কনফিগারেশন ফাইল রুট যেতে সম্ভবত প্রয়োজন হতে পারে।

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * Class that allows a device to identify itself on the INTRANET.
 * 
 * @author Decoded4620 2016
 */
public class NetIdentity {

    private String loopbackHost = "";
    private String host = "";

    private String loopbackIp = "";
    private String ip = "";
    public NetIdentity(){

        try{
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();

            while(interfaces.hasMoreElements()){
                NetworkInterface i = interfaces.nextElement();
                if(i != null){
                    Enumeration<InetAddress> addresses = i.getInetAddresses();
                    System.out.println(i.getDisplayName());
                    while(addresses.hasMoreElements()){
                        InetAddress address = addresses.nextElement();
                        String hostAddr = address.getHostAddress();

                        // local loopback
                        if(hostAddr.indexOf("127.") == 0 ){
                            this.loopbackIp = address.getHostAddress();
                            this.loopbackHost = address.getHostName();
                        }

                        // internal ip addresses (behind this router)
                        if( hostAddr.indexOf("192.168") == 0 || 
                                hostAddr.indexOf("10.") == 0 || 
                                hostAddr.indexOf("172.16") == 0 ){
                            this.host = address.getHostName();
                            this.ip = address.getHostAddress();
                        }


                        System.out.println("\t\t-" + address.getHostName() + ":" + address.getHostAddress() + " - "+ address.getAddress());
                    }
                }
            }
        }
        catch(SocketException e){

        }
        try{
            InetAddress loopbackIpAddress = InetAddress.getLocalHost();
            this.loopbackIp = loopbackIpAddress.getHostName();
            System.out.println("LOCALHOST: " + loopbackIp);
        }
        catch(UnknownHostException e){
            System.err.println("ERR: " + e.toString());
        }
    }

    public String getLoopbackHost(){
        return loopbackHost;
    }

    public String getHost(){
        return host;
    }
    public String getIp(){
        return ip;
    }
    public String getLoopbackIp(){
        return loopbackIp;
    }
}

আমি এই কোডটি চালানোর সময় আমি আসলে এর মতো একটি প্রিন্ট আউট পাই:

    Software Loopback Interface 1
        -127.0.0.1:127.0.0.1 - [B@19e1023e
        -0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
        -VIKING.yourisp.com:192.168.1.142 - [B@64b8f8f4
        -fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
Intel Edison USB RNDIS Device
Driver for user-mode network applications
Cisco Systems VPN Adapter for 64-bit Windows
VirtualBox Host-Only Ethernet Adapter
        -VIKING:192.168.56.1 - [B@3cd1f1c8
        -VIKING:fe80:0:0:0:d599:3cf0:5462:cb7%eth4 - [B@3a4afd8d
LogMeIn Hamachi Virtual Ethernet Adapter
        -VIKING:25.113.118.39 - [B@1996cd68
        -VIKING:2620:9b:0:0:0:0:1971:7627 - [B@3339ad8e
        -VIKING:fe80:0:0:0:51bf:994d:4656:8486%eth5 - [B@555590
Bluetooth Device (Personal Area Network)
        -fe80:0:0:0:4c56:8009:2bca:e16b%eth6:fe80:0:0:0:4c56:8009:2bca:e16b%eth6 - [B@3c679bde
Bluetooth Device (RFCOMM Protocol TDI)
Intel(R) Ethernet Connection (2) I218-V
        -fe80:0:0:0:4093:d169:536c:7c7c%eth7:fe80:0:0:0:4093:d169:536c:7c7c%eth7 - [B@16b4a017
Microsoft Wi-Fi Direct Virtual Adapter
        -fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1:fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1 - [B@8807e25
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0000
VirtualBox Host-Only Ethernet Adapter-WFP Native MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0001
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0002
VirtualBox Host-Only Ethernet Adapter-VirtualBox NDIS Light-Weight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0003
VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0004
VirtualBox Host-Only Ethernet Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0000
Intel(R) Ethernet Connection (2) I218-V-WFP Native MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0001
Intel(R) Ethernet Connection (2) I218-V-Shrew Soft Lightweight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0002
Intel(R) Ethernet Connection (2) I218-V-VirtualBox NDIS Light-Weight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0003
Intel(R) Ethernet Connection (2) I218-V-QoS Packet Scheduler-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0004
Intel(R) Ethernet Connection (2) I218-V-WFP 802.3 MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-WFP Native MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-Virtual WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-Native WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Broadcom 802.11ac Network Adapter-Shrew Soft Lightweight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Broadcom 802.11ac Network Adapter-VirtualBox NDIS Light-Weight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-QoS Packet Scheduler-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0006
Broadcom 802.11ac Network Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0007
Microsoft Wi-Fi Direct Virtual Adapter-WFP Native MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-Native WiFi Filter Driver-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0002
Microsoft Wi-Fi Direct Virtual Adapter-Shrew Soft Lightweight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Microsoft Wi-Fi Direct Virtual Adapter-VirtualBox NDIS Light-Weight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Microsoft Wi-Fi Direct Virtual Adapter-QoS Packet Scheduler-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0006

আমার ব্যবহারের জন্য আমি একটি আপ্নাপ সার্ভার সেট আপ করছি, এটি যে 'প্যাটার্নটি' সন্ধান করছিলাম তা বুঝতে সহায়তা করেছে। প্রত্যাবর্তিত কিছু বস্তু হ'ল ইথারনেট অ্যাডাপ্টার, নেটওয়ার্ক অ্যাডাপ্টারস, ভার্চুয়াল নেটওয়ার্ক অ্যাডাপ্টার, ড্রাইভার এবং ভিপিএন ক্লায়েন্ট অ্যাডাপ্টার। প্রত্যেকটিরই কোনও ঠিকানা নেই। সুতরাং আপনি ইন্টারফেস অবজেক্টগুলি এড়িয়ে যেতে চান যা না।

আপনি বর্তমানের লুপটিতে এটি যুক্ত করতে পারেন NetworkInterface i

while(interfaces.hasMoreElements()){
    Enumeration<InetAddress> addresses = i.getInetAddresses();
    System.out.println(i.getDisplayName());
    System.out.println("\t- name:" + i.getName());
    System.out.println("\t- idx:" + i.getIndex());
    System.out.println("\t- max trans unit (MTU):" + i.getMTU());
    System.out.println("\t- is loopback:" + i.isLoopback());
    System.out.println("\t- is PPP:" + i.isPointToPoint());
    System.out.println("\t- isUp:" + i.isUp());
    System.out.println("\t- isVirtual:" + i.isVirtual());
    System.out.println("\t- supportsMulticast:" + i.supportsMulticast());
}

এবং আপনি আপনার আউটপুটে এই জাতীয় তথ্য দেখতে পাবেন:

Software Loopback Interface 1
    - name:lo
    - idx:1
    - max trans unit (MTU):-1
    - is loopback:true
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [127.0.0.1(VIKING-192.168.56.1)]127.0.0.1:127.0.0.1 - [B@19e1023e
        -ADRESS: [0:0:0:0:0:0:0:1(VIKING-192.168.56.1)]0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
    - name:wlan0
    - idx:2
    - max trans unit (MTU):1500
    - is loopback:false
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [VIKING.monkeybrains.net(VIKING-192.168.56.1)]VIKING.monkeybrains.net:192.168.1.142 - [B@64b8f8f4
        -ADRESS: [fe80:0:0:0:81fa:31d:21c9:85cd%wlan0(VIKING-192.168.56.1)]fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
    - name:eth0
    - idx:3
    - max trans unit (MTU):-1
    - is loopback:false
    - is PPP:false
    - isUp:false
    - isVirtual:false
    - supportsMulticast:true

3

স্থানীয় ঠিকানা পেতে InetAddress.getLocalHost () ব্যবহার করুন

import java.net.InetAddress;

try {
  InetAddress addr = InetAddress.getLocalHost();            
  System.out.println(addr.getHostAddress());
} catch (UnknownHostException e) {
}

আমার পিপিপি সংযোগ আইপি ঠিকানাটি: 117.204.44.192 তবে উপরোক্তগুলি আমাকে 192.168.1.2 প্রদান করে
শশীদার

আপনার কাছে সমস্ত ইনটাএড্রেস দৃষ্টান্ত ক্রল করা দরকার এবং এটি সঠিক কোনটি তা নির্ধারণ করুন।
সঙ্কেতমুক্ত

1
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class IpAddress {

NetworkInterface ifcfg;
Enumeration<InetAddress> addresses;
String address;

public String getIpAddress(String host) {
    try {
        ifcfg = NetworkInterface.getByName(host);
        addresses = ifcfg.getInetAddresses();
        while (addresses.hasMoreElements()) {
            address = addresses.nextElement().toString();
            address = address.replace("/", "");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ifcfg.toString();
}
}

1

একটি বরং সরল পদ্ধতি যা মনে হচ্ছে এটি কাজ করছে ...

String getPublicIPv4() throws UnknownHostException, SocketException{
    Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
    String ipToReturn = null;
    while(e.hasMoreElements())
    {
        NetworkInterface n = (NetworkInterface) e.nextElement();
        Enumeration<InetAddress> ee = n.getInetAddresses();
        while (ee.hasMoreElements())
        {
            InetAddress i = (InetAddress) ee.nextElement();
            String currentAddress = i.getHostAddress();
            logger.trace("IP address "+currentAddress+ " found");
            if(!i.isSiteLocalAddress()&&!i.isLoopbackAddress() && validate(currentAddress)){
                ipToReturn = currentAddress;    
            }else{
                System.out.println("Address not validated as public IPv4");
            }

        }
    }

    return ipToReturn;
}

private static final Pattern IPv4RegexPattern = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

public static boolean validate(final String ip) {
    return IPv4RegexPattern.matcher(ip).matches();
}

1

আপনার মেশিনটি যদি কোনও নেটওয়ার্কের অংশ হয় তবে এটি আপনার নেটওয়ার্কের আইপি ঠিকানা পেয়েছে

try {
    System.out.println(InetAddress.getLocalHost().getHostAddress());
} catch (UnknownHostException e) {
    e.printStackTrace();
}

0

সাধারণত যখন আমি cmyip.com বা www.iplocation.net এর মতো আমার সার্বজনীন আইপি ঠিকানা সন্ধান করার চেষ্টা করি তখন আমি এইভাবে ব্যবহার করি:

public static String myPublicIp() {

    /*nslookup myip.opendns.com resolver1.opendns.com*/
    String ipAdressDns  = "";
    try {
        String command = "nslookup myip.opendns.com resolver1.opendns.com";
        Process proc = Runtime.getRuntime().exec(command);

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String s;
        while ((s = stdInput.readLine()) != null) {
            ipAdressDns  += s + "\n";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return ipAdressDns ;
}

0

যেহেতু আমার সিস্টেমে (অন্যান্য অনেক সিস্টেমের মতো) বিভিন্ন নেটওয়ার্ক ইন্টারফেস ছিল। InetAddress.getLocalHost()বা Inet4Address.getLocalHost()কেবল এমনটিই ফিরিয়ে দিয়েছিল যা আমি পছন্দ করি না। অতএব আমাকে এই নিষ্পাপ পদ্ধতির ব্যবহার করতে হয়েছিল।

InetAddress[] allAddresses = Inet4Address.getAllByName("YourComputerHostName");
        InetAddress desiredAddress;
        //In order to find the desired Ip to be routed by other modules (WiFi adapter)
        for (InetAddress address :
                allAddresses) {
            if (address.getHostAddress().startsWith("192.168.2")) {
                desiredAddress = address;
            }
        }
// Use the desired address for whatever purpose.

কেবল সতর্কতা অবলম্বন করুন যে এই পদ্ধতির মধ্যে আমি ইতিমধ্যে জানতাম যে আমার কাঙ্ক্ষিত আইপি ঠিকানা 192.168.2সাবনেটে আছে।


-1
public static String getIpAddress() {

    String ipAddress = null;

    try {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();

        while (networkInterfaces.hasMoreElements()) {

            NetworkInterface networkInterface = networkInterfaces.nextElement();

            byte[] hardwareAddress = networkInterface.getHardwareAddress();
            if (null == hardwareAddress || 0 == hardwareAddress.length || (0 == hardwareAddress[0] && 0 == hardwareAddress[1] && 0 == hardwareAddress[2])) continue;

            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();

            if (inetAddresses.hasMoreElements()) ipAddress = inetAddresses.nextElement().toString();

            break;
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }

    return ipAddress;
}

দয়া করে আপনার কোড কী করে সে সম্পর্কে কিছু ব্যাখ্যা যুক্ত করুন।
এইচক্রারস্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.