java是通过NetworkInterface来获取本机IP地址的信息。
Socket:一台机器的通讯节点称为socket,在java中,socket是java.net包里面的Socket,ServerSocket,DataGramSocket,MultiSocket的实例。
IP地址java中用java.net.InetAddress来表示。 InetAddress:ip地址或者域名,指向远程地址。如果域名解析不了,则出错。
抽象类,有两个子类:Inet4Address和Inet6Address。这两个类智能通过InetAddress的静态方法获取,不能直接构造。包可见。 InetSocketAddress extends SocketAddress:ip socket地址,用{ip,port}或者{hostname,port}表示。也能够单独用port构造,表示本机ip地址,所有本机网络地址。 NetwordInterface:本机网络接口,由多个网络接口名称和对应的网络接口的ip地址列表构成。 网络主机有两个特殊的网络地址:
loopback:127.0.0.1 用来检测本机的host名称,或者检测本地ip地址是否可用。 wildcard:0.0.0.0 绑定了本机所有的ip地址。
可以看到上面的代码,是获取手机ip的核心代码。由两个for循环组成。首先第一个for循环是在所有和本机绑定的网络接口中进行遍历。(Enumeration是一个接口,它生成一个一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。它含有两个方法:
hasMoreElements() 测试此枚举是否包含更多的元素;nextElement() 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。)第二个for循环则是在与每一个网络接口绑定的ip地址中进行遍历。如果在1秒中内不能建立这个连接,则认为该连接不可行。
但是有时候会出现fe80::aef7:f3ff:fe8c:5da4%wlan0这样的IP地址。这是IPV6的地址。但是我们需要的是IPV4的地址,故需要加上一个判断,即代码中的蓝色部分。蓝色部分实际上就是判断当前的IP是否是IPV4的地址。如果没有这句话,那么IPV6的地址在后面会被默认当做IPV4来处理,所以会出现问题。 |
|