试图做我的家庭作业,但无法弄清楚。
我正在制作一个可以在手机上运行的应用程序,该手机可以 24/7 全天候连接到我的家庭 wifi。我希望它检测主机 ip 并跟踪任何更改,但我无法让代码正常工作。我找到了 InetAddress 类,这似乎是我需要的,但是下面的代码抛出了一个通用异常“有什么不好的地方出错了”,我不知道如何确定它,因为它不是该方法抛出的 UnknownHostException文档:
public void getIP(View view) {
isNetOK();
getLocalIpAddress();
}
public void isNetOK() {
//get connectivity manager
connMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//call getActiveNetworkInfo method of connMan, returns a networkInfo object
NetworkInfo netInfo = connMan.getActiveNetworkInfo();
if (netInfo !=null && netInfo.isConnected()) {
setViewText("net_stat", "Network Connected");
netOK = true;
} else {
setViewText("net_stat", "Network Unavailable");
}
}
public void getLocalIpAddress() {
isNetOK();
if (netOK) {
try{
InetAddress ownIP = InetAddress.getLocalHost();
localIP = ownIP.toString();
}catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
isNetOK 工作得很好,我已经单独调用了一天左右。
有人可以指出为什么这段代码不起作用吗?这是最好的方法吗?我的目标是将家中的服务器与我在 GoDaddy 获得的域名相关联。我的 IP 地址是动态的,但每隔几个月或断电时才会更改。我想要一个可以不时检查 ip 的应用程序(6 小时?),如果它发生变化,请通知我,以便我可以更新 DNS。我知道,hacky 和慢等等,但它真的只是供私人使用,看看我是否可以让它工作。
编辑 1
我在下面的 budcopter 答案中尝试了该方法,最后得到了一些代码,并进行了一些更改:
public void getLocalIpAddress() {
if (netOK) {
try{
WifiManager WiMan = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = WiMan.getConnectionInfo();
int address = wifiInfo.getIpAddress();
String ipAddress = (String) Integer.toString(address);
setViewText("ip_view", ipAddress);
} /*catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} */catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
这将返回一个有效的 int,长度为十位。但是,当我对照 whatismyip.com 进行检查时,它们甚至不一样。手机的 LAN 地址是 192.168.1.110,我们的外部 ip 是 75.xx.xx.xxx,返回的 int 是 1812048064。即使我重启 WiFi 无线电,也会返回相同的数字。知道 WifiManager 系统服务给我的号码是多少吗?
此外,如果 WiFi 被禁用,我将添加一个检查以防止请求地址,但目前这是微不足道的。