我的应用程序有一个用户可以从家庭局域网访问的Web服务器。目前我有两种获取设备IP的方法,我不知道哪种方式更可能是正确的。
我的正常方式:
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface intf : interfaces) {
List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
for (InetAddress addr : addrs) {
if (!addr.isLoopbackAddress()) {
String sAddr = addr.getHostAddress().toUpperCase();
我的替代方式:
WifiInfo connectionInfo = wifiMgr.getConnectionInfo();
int ip = connectionInfo.getIpAddress();
我觉得这个问题一直很好但我确实有一些统计数据,看起来两个ips只有4%的时间不同。
此外,我刚刚在Chromebook上尝试了我的应用,其他方式实际上是正确的,而不是正常的方式。
那么我怎么知道哪种方式更好还是有更好的选择呢?
答案 0 :(得分:0)
它们非常不可靠,因为你必须处理很多边缘情况。
我更喜欢使用免费的外部服务;进行网络通话并获得适当的公众面向IP。试试https://www.ipify.org/
答案 1 :(得分:0)
扫描NetworkInterfaces当然可以返回各种结果。您可以从intf.getName()
了解更多内容,例如:
wlan0
rmnet1
lo
上的环回(127.0.0.1) - 您已经取消了此eth0
- 某些Chromebook可能还有更多可能性,如VPN连接。
如果可以肯定地说您只想在Wifi连接上连接到Web服务器,则可以添加一个检查,界面名称以wlan
开头,但是对于这种情况,你的替代解决方案似乎更简单。
如果Chromebook上也可以使用以太网连接,则网络服务器可能会在wlan0
和eth0
上提供连接。从网络接口中选择首选连接,或者甚至准备提供无线和有线IP。
答案 2 :(得分:0)
我正在使用以下方式从Android设备获取本地IP地址,这对我来说很好看:
public static 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() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
return null;
}
这与您的常规方式几乎相同,但有点精致。希望这会有所帮助!
答案 3 :(得分:0)
我建议你将IP内容移动到服务器/后端部分。它更可靠,通常更容易(你不必处理android API&#39; s)来确定服务器上的这种东西,因为大多数连接属性都以头字段的形式传递给你。
您可以在以下标题中查找客户端IP(这取决于您的服务器设置,但在大多数情况下,这就足够了):
由于您说某些标题中仅从本地网络访问您的服务器,因此您只能获得本地IP
答案 4 :(得分:-1)
在公共互联网上建立TCP连接,然后检查该套接字的源IP。
/ JB