【问题标题】:Occasional error Using InetAddress.getByName()使用 InetAddress.getByName() 时偶尔出错
【发布时间】:2014-11-07 15:42:48
【问题描述】:

在我的应用程序中,我经常使用 InetAddress.getByName() 将诸如“192.168.1.56”之类的字符串转换为 InetAddress 对象——主要是因为在我看来,将 IP 地址存储为 IP 地址而不是一个好主意而不是作为字符串。到现在为止,我还发誓这也是万无一失的,但今天我发现了一个错误。这不起作用:

InetAddress ia = InetAddress.getByName ("192.168.1.056");

我的 Android 似乎认为该字符串是主机名,因此它试图查找它(这是不可能的,因为它不在“真实”网络上)。这是我可以解决的问题 - 意思是有没有办法坚持 getByName 这是一个 IP 地址,而不是主机名?或者我是否需要构建方法来清除 IP 地址字符串中的前导零?或者是否有埋在某处的 Apache 实用程序可以做得更好?

【问题讨论】:

  • 你得到什么错误?此外,某些实现会将前导零作为八进制值处理,这不是您想要的。不确定这个。
  • 查看这个问题和答案:stackoverflow.com/questions/9556978/…
  • 我得到的错误是 NetworkOnMainThread——这让我相信该软件正在将字符串视为主机名并通过网络尝试解决它——这既不可能也不可能正确的事情。抱歉,帖子不完整。
  • Anas:我做过,但这似乎与这个问题无关。我的地址字符串中有 4 个数字,分别验证为实际 BE 和 IP 地址(使用 java.util.regex.Pattern)。
  • 你能发布堆栈跟踪吗?

标签: java android inetaddress


【解决方案1】:

为什么不试试getByAddress (byte[] ipAddress)?这种方法似乎更适合您的需求。

【讨论】:

  • 我正在使用我的代码来解析用户在对话框 EditText 中提供的 IP 地址字符串。显然,我的一个用户发现了一种新的有趣的方式来搞砸事情。我试图捕获错误,而不是求助于无效地址错误并且什么都不做。
【解决方案2】:

可能是正则表达式向导找到了直接修复 IP 地址字符串的方法,但我不知道该怎么做。但是,有一个叫做 Apache SubnetUtils 库的东西,它是 Android 原生的。 SubnetUtils 没有对带有前导零的 IP 地址字符串的奶牛。我的代码如下所示:

public static InetAddress addrFromStr (String addr)
{
    InetAddress ia = null;
    SubnetUtils su = new SubnetUtils (addr + "/8");

    try
    {
        ia = InetAddress.getByName (su.getInfo().getAddress());
    }
    catch (UnknownHostException e)
    { }

    return ia;
}

基本上,我创建了一个 SubnetUtils 对象,然后向它询问 IP 地址 - 现在已去除 InetAddress.getByName() 显然无法处理的任何数字奇异性。 (“/8”业务是 CIDR 表示法子网掩码,我只能说不要使用“/0”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多