如何获取我的IP地址?

8

我有一个serverSocket,我想知道它的IP地址,但是

listenSocket.getInetAddress().toString();

我得到了0.0.0.0。 如何获取IP地址,或者(如果启用了两个连接)其中一个?


https://dev59.com/l2025IYBdhLWcg3wVkif - Rudolf Real
3个回答

15

我过去曾经使用过这个:

public String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(LOG_TAG, ex.toString());
    }
    return null;
}

来源: http://www.droidnova.com/get-the-ip-address-of-your-device,304.html


1
正确答案。我认为inetAddress.isSiteLocalAddress()比!inetAddress.isLoopbackAddress()更好。 - Craig B
@CraigB:我喜欢你的想法——isSiteLocalAddress()对于人来说更容易理解一些。但是使用它,我总是得到127.0.0.1,“自己”的IP地址。因此,我建议坚持使用isLoopbackAddress()。 - SMBiggs
正如@SatishKumar在另一个答案中指出的那样,如果您只想要IPv4地址,则需要使用InetAddressUtils.isIPv4Address()来检查IP。否则,您可能会收到IPv6地址。 - Guillaume Boudreau
对我来说效果不太好,只给了我IPv6。这个更有帮助:https://dev59.com/l2025IYBdhLWcg3wVkif - Rudolf Real

2

0

如果你得到了0.0.0.0,那可能是因为你的监听套接字正在接受机器所有接口的连接。通常至少会有两个接口--一个用于与外界通信,另一个是本地主机/环回接口。因此,要求它的一个地址并不清晰。

一旦你接受了一个传入的连接,你可以询问正在处理的特定接口的地址。

找到一个“好”的IP地址的快速技巧是建立一个出站连接到一个已知的站点,并在连接后请求其本地端的地址。这比枚举网络接口更具可移植性(如果你关心这些东西),但当然需要你有一个你信任的可以连接到并且保持活动和可达的目标。


有没有一个包含一些示例代码的SO答案链接来完成这个任务?关于这个话题似乎有很多讨论。我正在尝试定位我的桌面应用程序在哪里运行。我已经有了地理定位器代码,但需要用户的外部IP地址。谢谢。 - Will
@Will:一般来说,这些解决方案(我的答案或其他答案)只会告诉你本地IP地址,这通常是RFC-1918网络中的NAT地址。 - hmakholm left over Monica
这也是我的发现。我想我会发布一个新的问题。 - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接