如下为dubbo的代码

    1. private static Optional<InetAddress> toValidAddress(InetAddress address) {
    2. if (address instanceof Inet6Address) {
    3. Inet6Address v6Address = (Inet6Address) address;
    4. if (isPreferIPV6Address()) {
    5. return Optional.ofNullable(normalizeV6Address(v6Address));
    6. }
    7. }
    8. if (isValidV4Address(address)) {
    9. return Optional.of(address);
    10. }
    11. return Optional.empty();
    12. }
    13. private static InetAddress getLocalAddress0() {
    14. InetAddress localAddress = null;
    15. try {
    16. localAddress = InetAddress.getLocalHost();
    17. Optional<InetAddress> addressOp = toValidAddress(localAddress);
    18. if (addressOp.isPresent()) {
    19. return addressOp.get();
    20. }
    21. } catch (Throwable e) {
    22. logger.warn(e);
    23. }
    24. try {
    25. Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
    26. if (null == interfaces) {
    27. return localAddress;
    28. }
    29. while (interfaces.hasMoreElements()) {
    30. try {
    31. NetworkInterface network = interfaces.nextElement();
    32. if (network.isLoopback() || network.isVirtual() || !network.isUp()) {
    33. continue;
    34. }
    35. Enumeration<InetAddress> addresses = network.getInetAddresses();
    36. while (addresses.hasMoreElements()) {
    37. try {
    38. Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());
    39. if (addressOp.isPresent()) {
    40. try {
    41. if (addressOp.get().isReachable(100)) {
    42. return addressOp.get();
    43. }
    44. } catch (IOException e) {
    45. // ignore
    46. }
    47. }
    48. } catch (Throwable e) {
    49. logger.warn(e);
    50. }
    51. }
    52. } catch (Throwable e) {
    53. logger.warn(e);
    54. }
    55. }
    56. } catch (Throwable e) {
    57. logger.warn(e);
    58. }
    59. return localAddress;
    60. }
    61. public static String getHostName(String address) {
    62. try {
    63. int i = address.indexOf(':');
    64. if (i > -1) {
    65. address = address.substring(0, i);
    66. }
    67. String hostname = HOST_NAME_CACHE.get(address);
    68. if (hostname != null && hostname.length() > 0) {
    69. return hostname;
    70. }
    71. InetAddress inetAddress = InetAddress.getByName(address);
    72. if (inetAddress != null) {
    73. hostname = inetAddress.getHostName();
    74. HOST_NAME_CACHE.put(address, hostname);
    75. return hostname;
    76. }
    77. } catch (Throwable e) {
    78. // ignore
    79. }
    80. return address;
    81. }