【发布时间】:2014-05-16 03:26:51
【问题描述】:
我制作了一个需要连接一个由 wamp 服务器提供的本地数据库的 android 应用程序。首先使用android虚拟设备(AVD)我的IP第一次连接服务器曾经是:10.0.2.2。我的 AVD 连接正常,但是当我尝试在我的设备上直接连接时,他没有找到具有此 10.0.2.2 IP 的本地服务器。此时,我已将 IP 更改为 192.168.1.5,这是我的 LAN 电缆 IP,设备和 AVD 都运行没有问题……但有时我需要更改与 wifi 的连接,这会更改 IP ..另外,我意识到在我的源代码中修复一个 IP 将是发布 android 应用程序的问题,因为其他人将拥有其他 LAN IP 地址。
为了解决这个问题,我开始寻找解决方案,比如动态获取局域网IP。为此,我构建了这个 Java 应用程序作为测试:
public class test {
public static void main(String[] args) throws Exception
{
String roundHost = null;
Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
for (; n.hasMoreElements();)
{
NetworkInterface e = n.nextElement();
Enumeration<InetAddress> a = e.getInetAddresses();
for (; a.hasMoreElements();)
{
InetAddress addr = a.nextElement();
if (addr.isSiteLocalAddress()){
String pureHost = addr.getByName(addr.getHostName()).toString();
roundHost = addr.getHostAddress();
pureHost = pureHost.substring(addr.getHostName().length()+1);
if(!roundHost.equals(pureHost))
break;
}
}
}
System.out.println(roundHost);
}
}
作为输出,这个 java 应用程序为我提供了正确的 LAN wifi IP,甚至是我的 LAN 电缆 IP,即 192.168.1.3 或 192.168.1.7。从这里我制作了一个“IPParser”以在我的 android 应用上使用:
public class IPParser {
String pureHost, roundHost = null;
public IPParser() throws UnknownHostException{
Enumeration<NetworkInterface> n = null;
try {
n = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e1) {
e1.printStackTrace();
}
for (; n.hasMoreElements();)
{
NetworkInterface e = n.nextElement();
Enumeration<InetAddress> a = e.getInetAddresses();
for (; a.hasMoreElements();)
{
InetAddress addr = a.nextElement();
if (addr.isSiteLocalAddress()){
pureHost = addr.getByName(addr.getHostName()).toString();
roundHost = addr.getHostAddress();
pureHost = pureHost.substring(addr.getHostName().length()+1);
if(!roundHost.equals(pureHost))
break;
}
}
}
}
public String returnIp() {
return roundHost;
}
}
如您所见,它非常相似;不同之处只是一些结构更改以适应所需的语法。现在真正的问题来了:当我尝试在我的 AVD 中运行这个解析器时,我的 ip 是 10.0.2.15 并直接在我的设备中运行,ip 返回是 192.168.1.6 - 显然 android 应用程序崩溃了,因为它找不到要连接的本地服务器。
我的 IP 配置信息:
我不是网络专家,所以我问,放轻松,如果我说技术上的错误或相邻的内容,请编辑并纠正我..最后我问:
为什么会发生这种情况以及如何解决这个问题?
【问题讨论】:
-
如果服务器是本地的,为什么不能只使用 127.0.0.1?
-
根本不起作用(127.0.0.1);应用程序崩溃:stackoverflow.com/questions/5806220/…;我对此进行了大量研究..考虑到变量的数量(使用 AVD、使用真实设备、其他人的 wifi),它不太可能修复 ip...
-
我误解了,我假设当您说“在本地运行”时,您的意思是在设备上本地运行。如果您在网络内的计算机上运行该服务,您需要另一个进程来解决它,可能是一个可公开访问的 IP 地址?
标签: java android networking ip localhost