我正在使用Android Studio 1.3 今天我在一个字符串中给出一个手动IP地址。
在我的笔记本电脑上,我正在运行一个Web服务器。 在我的Android Studio上,我正在运行一个客户端。 问题是我目前正在使用硬编码的IP地址手动连接到Web服务器。
我的电脑室里有一台路由器,我用笔记本电脑连接到路由器网络。 例如,我的笔记本电脑IP地址是10.0.0.3,如果我登录到我的路由器设置,我可以看到笔记本电脑连接。
问题有时候,如果我的电脑由于某种原因关闭,下次它可能会连接到我的路由器使用不同的IP地址。
在Android Studio的Java端,我做了:
public void addListenerOnButton()
{
btnClick = (Button) findViewById(R.id.checkipbutton);
btnClick.setOnClickListener(new OnClickListener()
{
byte[] response = null;
@Override
public void onClick(View arg0)
{
text = (TextView) findViewById(R.id.textView2);
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
for (int i = 0; i < ipaddresses.length; i++)
{
counter = i;
try
{
response = Get(ipaddresses[i]);
}
catch (Exception e)
{
String err = e.toString();
}
if (response!=null)
{
try
{
final String a = new String(response, "UTF-8");
text.post(new Runnable()
{
@Override
public void run()
{
text.setText(a + " Oמ " + ipaddresses[counter]);
String successconnected = null;
successconnected = "Successfully connected";
textforthespeacch = successconnected;
MainActivity.currentActivity.initTTS();
}
});
iptouse = ipaddresses[i].substring(0,ipaddresses[i].lastIndexOf("=")+1);
connectedtoipsuccess = true;
Logger.getLogger("MainActivity(inside thread)").info(a);
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
Logger.getLogger("MainActivity(inside thread)").info("encoding exception");
}
Logger.getLogger("MainActivity(inside thread)").info("test1");
break;
}
else
{
}
}
counter = 0;
if (response == null)
{
text.post(new Runnable()
{
@Override
public void run()
{
text.setText("Connection Failed");
String successconnected = null;
successconnected = "connection failed";
textforthespeacch = successconnected;
MainActivity.currentActivity.initTTS();
}
});
}
}
});
t.start();
}
});
}
}
然后在addListenerOnButton中:
while read; do ... done < file
现在在我的个人电脑室,笔记本电脑的IP地址是10.0.0.3 我还将我的笔记本电脑添加到我的路由器作为笔记本电脑mac的静态IP地址。
在我的Java代码中,我有一个10.0.0.3的字符串,但是如果我把我的笔记本电脑和我的Android设备带到我的客厅那里有一个不同的网络,那么笔记本电脑的IP地址就是其他的。
我想要做的是,当我现在点击按钮时,它只是尝试连接到字符串中的给定IP地址,但我希望它能自动检测路由器中的笔记本电脑IP地址并连接到它。
所以我不需要在字符串中的IP地址中一直更改我的java代码。
我认为它被称为umdp不确定。
答案 0 :(得分:0)
您可以选择查询Android设备的ARP缓存。不幸的是,由于这只是Android所见过的所有设备的列表,因此可能不是100%完整。那么,你可以做的是获取你的IP,然后ping该子网上的所有可能的IP,强制缓存更新。从那里,您可以在缓存中搜索笔记本电脑的MAC地址并读取其IP。这里有一些(未经测试的)代码,它们可以帮助您走上正确的轨道:
private static void refereshArp(Context ctx){
//IP aquisition from http://stackoverflow.com/a/6071963/1896516
WifiManager wm = (WifiManager) ctx.getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
String[] parts = ip.split(".");
String subnet = parts[0] + "." + parts[1] + "." + parts[2] + ".";
Runtime rt = Runtime.getRuntime();
for(int i=0; i<256; i++){
try{
rt.exec("ping -c1 " + subnet + i)
}catch(IOException e){
continue;
}
}
}
//Adapted from http://www.flattermann.net/2011/02/android-howto-find-the-hardware-mac-address-of-a-remote-host/
private static String getIpFromMac(String mac) {
if (mac == null)
return null;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = br.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted != null && splitted.length >= 4 && mac.equals(splitted[3])) {
// return the ip of the device
return splitted[0];
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
如果您使用笔记本电脑的MAC拨打refreshArp()
然后getIpFromMac()
,则只要他们在同一个网络上就可以获得IP。同样,我还没有测试过这段代码,因此可能需要进行一些调整才能使其正常工作。