[Java] جافا InetAddress.getLocalHost ()؛ إرجاع 127.0.0.1 ... كيفية الحصول على إب الحقيقي؟


Answers

كما قد يكون الجهاز عناوين متعددة، فإنه من الصعب تحديد أي واحد هو واحد بالنسبة لك. عادة، تريد أن يقوم النظام بتعيين إب استنادا إلى جدول التوجيه الخاص به. ونتيجة لذلك يعتمد على إب كنت ترغب في الاتصال، وهناك خدعة بسيطة: ببساطة إنشاء اتصال ومعرفة ما عنوان كنت قد حصلت من نظام التشغيل:

// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());

أنا لست متأكدا ما إذا كان من الممكن القيام بذلك دون إقامة اتصال على الرغم من. أعتقد أنني تمكنت مرة واحدة من القيام بذلك مع بيرل (أو C؟)، ولكن لا تسألني عن جافا. وأعتقد أنه قد يكون من الممكن إنشاء مأخذ أودب (داتاغرامزوكيت) دون الاتصال فعلا.

إذا كان هناك جهاز توجيه نات على الطريقة التي لن تكون قادرة على الحصول على إب أن المضيفين البعيد سوف نرى على الرغم من. ومع ذلك، كما أعطيت 192. * كمثال، أعتقد أنك لا تهتم.

Question

أنا أكتب التطبيق الشبكات بسيطة ... أنا بحاجة إلى معرفة الملكية الفكرية الحقيقي من الجهاز الخاص بي على الشبكة، مثل 192.168.1.3. جيتلوكالهوست يعود 127.0.0.1 (على لينكس، دونو إذا كان هو نفسه على ويندوز) كيف نفعل ذلك ؟؛




هنا هو وسيلة لتجنب IPv6 والنتائج الاسترجاع.

public InetAddress getCurrentIp() {
            try {
                Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
                        .getNetworkInterfaces();
                while (networkInterfaces.hasMoreElements()) {
                    NetworkInterface ni = (NetworkInterface) networkInterfaces
                            .nextElement();
                    Enumeration<InetAddress> nias = ni.getInetAddresses();
                    while(nias.hasMoreElements()) {
                        InetAddress ia= (InetAddress) nias.nextElement();
                        if (!ia.isLinkLocalAddress() 
                         && !ia.isLoopbackAddress()
                         && ia instanceof Inet4Address) {
                            return ia;
                        }
                    }
                }
            } catch (SocketException e) {
                LOG.error("unable to get current IP " + e.getMessage(), e);
            }
            return null;
        }



بدلا من استخدام InetAddress.getHostAddress ()، أدعو روتين gethost4Address التي كتبت للحصول على أول عنوان غير استرجاع ...

/**
 * Returns this host's non-loopback IPv4 addresses.
 * 
 * @return
 * @throws SocketException 
 */
private static List<Inet4Address> getInet4Addresses() throws SocketException {
    List<Inet4Address> ret = new ArrayList<Inet4Address>();

    Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
    for (NetworkInterface netint : Collections.list(nets)) {
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
                ret.add((Inet4Address)inetAddress);
            }
        }
    }

    return ret;
}

/**
 * Returns this host's first non-loopback IPv4 address string in textual
 * representation.
 * 
 * @return
 * @throws SocketException
 */
private static String getHost4Address() throws SocketException {
    List<Inet4Address> inet4 = getInet4Addresses();
    return !inet4.isEmpty()
            ? inet4.get(0).getHostAddress()
            : null;
}



الحصول على الطلب الحالي من المثيل الحالي

HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

ثم الحصول على عنوان من الطلب

ip = httpServletRequest.getRemoteAddr();