【问题标题】:Get outgoing IP address in Java RMI在 Java RMI 中获取传出 IP 地址
【发布时间】:2011-06-30 17:42:07
【问题描述】:

在我的 java RMI 应用程序中,我可以拥有在本地和不同主机上充当服务器的实例。在后一种情况下,如何获取我的传出 IP 地址,以便将其设置为系统属性 java.rmi.server.hostName 的参数?

现在它是硬接线,但这不是一个理想的解决方案。

【问题讨论】:

  • 请考虑,如果服务器位于 NAT 防火墙后面,则传出主机 IP 可能不是客户端看到的。

标签: java ip-address rmi


【解决方案1】:

你可以使用经典的Java方式:

try {
    InetAddress addr = InetAddress.getLocalHost();

    // Get IP Address
    byte[] ipAddr = addr.getAddress();

    // Get hostname
    String hostname = addr.getHostName();
} catch (UnknownHostException e) {
}

【讨论】:

    【解决方案2】:

    以下将显示主机上所有可用的非环回 IPv4 地址。您也可以轻松调整它以获取 IPv6 地址。

    public static void main(String...args) {
      List<InetAddress> addresses = getNonLocalIPV4Addresses();
      for (InetAddress addr: addresses) {
        System.out.println("address: " + addr.getHostAddress());
      }
    }
    
    /**
     * Get a list of all known non-local IP v4 addresses for the current host.
     * @return a List of <code>InetAddress</code>, may be empty but never null.
     */
    public static List<InetAddress> getNonLocalIPV4Addresses() {
      return getIPAddresses(new InetAddressFilter() {
        public boolean accepts(InetAddress addr) {
          return (addr instanceof Inet4Address)
            && !(addr.isLoopbackAddress()) || "localhost".equals(addr.getHostName()));
        }
      });
    }
    
    /**
     * Get a list of all known IP addresses for the current host,
     * according to the specified filter.
     * @param filter filters out unwanted addresses.
     * @return a List of <code>InetAddress</code>, may be empty but never null.
     */
    public static List<InetAddress> getIPAddresses(InetAddressFilter filter) {
      List<InetAddress> list = new ArrayList<InetAddress>();
      try {
        Enumeration<NetworkInterface> interfaces =
          NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
          NetworkInterface ni = interfaces.nextElement();
          Enumeration<InetAddress> addresses = ni.getInetAddresses();
          while (addresses.hasMoreElements()) {
            InetAddress addr = addresses.nextElement();
            if ((filter == null) || filter.accepts(addr)) list.add(addr);
          }
        }
      } catch(Exception e) {
        e.printStackTrace();
      }
      return list;
    }
    
    /**
     * Filter interface for the methods discovering available IP addresses. 
     */
    public interface InetAddressFilter {
      /**
       * Determine whether the specified address is accepted.
       * @param addr the address to check.
       * @return true if the address is accepted, false otherwise.
       */
      boolean accepts(InetAddress addr);
    }
    

    【讨论】:

      【解决方案3】:

      我不明白你为什么认为你需要这个。传出存根中的源地址自动设置为主机的 IP 地址。唯一需要设置此属性的情况是默认设置不正确:例如如果您有多个 NIC 并且只想通过一个导出,或者您的 Linux 配置错误,将您的主机名映射到 127.0.0.1 而不是您的 IP 地址。

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 2011-02-25
        • 2013-12-04
        • 2011-12-26
        • 1970-01-01
        • 2012-04-06
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多