1

我正在局域网上寻找一台名为“Base”的计算机 但是,我找不到它,返回的是我的 ISP 的地址(因此网络访问肯定是有效的)。返回是“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。没运气

4

2 回答 2

0

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

  1. 如果您使用的是您的 ISP(您可能是)的 DNS,那么当您的 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”部分。)

于 2011-03-15T04:34:42.477 回答
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) { }
    }
}
于 2020-12-10T07:24:05.560 回答