提示:您可在线编辑运行本教程的实例 - 运行实例,去试试!
返回最有可能是外部地址的地址。
/* * GNU GENERAL PUBLIC LICENSE * Version 2, June 1991 * * ADDITIONAL REQUIREMENT * * 1. If PeerfactSim.KOM is used for the evaluation in research publications, * the following should be referenced: * * @techreport{ PWLS07, * author = {Konstantin Pussep and Matthias Weinert and Nicolas Liebau and Ralf Steinmetz}, * title = {Flexible Framework for NAT Traversal in Peer-to-Peer Applications}, * month = {Nov}, * year = {2007}, * institution = {KOM - Multimedia Communications Lab, Technische Universit{\"a}t Darmstadt}, * address = {Merckstra{\ss}e 25, 64283 Darmstadt, Germany}, * number = {KOM-TR-2007-06}, * } */ //package com.nowjava;//来 自 n o w j a v a . c o m import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; public class Main { public static void main(String[] argv) throws Exception { /* from nowjava - 时 代 Java */ System.out.println(getMostProbableExternalAddress()); } /** * Returns the address which is most likely the external address. The result does not have * to be valid in the external network, since this method does not check for NAT-environments * etc. * * @param addresses list of addresses * @return the address which is most probably the external address */ public static InetAddress getMostProbableExternalAddress() { // get network interfaces Collection<NetworkInterface> activeIfs = getNetworkInterfaces(); // get non-internal addresses ArrayList<InetAddress> localAddr = new ArrayList<InetAddress>(); ArrayList<InetAddress> nonLocalAddr = new ArrayList<InetAddress>(); for (NetworkInterface ni : activeIfs) { Enumeration<InetAddress> addresses = ni.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); if (hasLocalScope(addr)) localAddr.add(addr); else nonLocalAddr.add(addr); } } // have nonlocal addresses? then return the "best" if (!nonLocalAddr.isEmpty()) { String removeAddrPrefixes[] = { "5.", "10.", "192." }; for (String s : removeAddrPrefixes) { InetAddress last = nonLocalAddr.get(0); if (nonLocalAddr.size() == 1) return last; removeAddressesWith(nonLocalAddr, s); if (nonLocalAddr.size() == 0) return last; else if (nonLocalAddr.size() == 1) return nonLocalAddr.get(0); } // we tried to get the right one, but more than one are left.. return first entree return nonLocalAddr.get(0); } // we dont want to return (link-)local addresses, throw exception throw new IllegalStateException("No external address found!"); } /** * Returns all network interfaces of this host. * @return all network interfaces of this host */ public static Collection<NetworkInterface> getNetworkInterfaces() { // get network interfaces ArrayList<NetworkInterface> result = new ArrayList<NetworkInterface>(); Enumeration<NetworkInterface> ifs = null; try { ifs = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e1) { throw new IllegalStateException( "Could not enumerate network interfaces!"); } while (ifs.hasMoreElements()) { result.add(ifs.nextElement()); } return result; }