InetAddress.getByName不起作用

时间:2011-03-10 14:39:46

标签: android networking lan

我正在寻找一台名为“Base”的计算机 但是,我找不到它,回来的是我的ISP的地址(所以Net访问肯定是有效的)。回报是“Base / 81.200.64.50”。基本上,它找不到名称。 我正在使用模拟器。 我正在使用的代码是在Windows上运行的Java代码的副本,并且工作正常 - 返回我的LAN地址。我错过了什么?

代码是:

InetAddress address = InetAddress.getByName(Constants.serverNameStr);

好的 - 问题似乎是DNS查找。 如果我将“Base”替换为“www.google.com”,我会收到74.125.230.145,这是google。 似乎模拟器无法使用本地路由器DNS解析名称。 我试过在模拟器上调整设置,但没有运气。 有什么想法吗?


还尝试在模拟器的调试配置中输入LAN路由器的DNS。 没有运气

2 个答案:

答案 0 :(得分:0)

我遇到类似的问题,无法从InetAddress.getByName()获取任何有用的信息,但我确实找到了一些可能有用的东西:

  1. 如果您使用的是您的ISP(您可能是)的DNS,那么当您的ISP无法找到您请求的主机时,您的ISP可能会为其中一个网站提供IP地址。例如,Comcast在找不到主机时返回真实网页的IP地址。大多数意识到这一点的人都不想要这种行为,您可以通过将家庭路由器中的DNS地址更改为指向Google的DNS服务器来解决此问题。使用8.8.8.8和8.8.4.4(适用于主DNS服务器和辅助DNS服务器。)Google的DNS服务器通常也更快,更安全。更改路由器中的DNS服务器后,当您要求找不到它无法找到的主机时,InetAddress.getByName()将抛出UnknownHostException。

  2. 如果在家庭路由器的连接设备列表中看到本地计算机名称,则可能需要在主机名中添加“.local”作为InetAddress.getByName()的参数。例如,Mac笔记本电脑的主机名通常以“.local”结尾,但路由器表格不会向用户显示。 (至少,我的NetGear路由器没有显示主机名的“.local”部分。)

答案 1 :(得分:0)

在主线程上运行时,此方法在Android应用程序上失败。您需要创建一个类似于以下内容的可运行线程:-

public static class GetIPAddresses extends java.lang.Thread {
    public void run() {
        int i = 0;
        byte[][] addresses = new byte[20][];
        try {
            InetAddress[] machines = InetAddress.getAllByName("www.bing.com");
            for (InetAddress address : machines) {
                addresses[i++] = address.getAddress();
            }
        } catch (Exception e) { }
    }
}