如何自动找到网络IP地址并连接到它?

时间:2015-08-25 21:29:28

标签: java android android-studio

我正在使用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不确定。

1 个答案:

答案 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。同样,我还没有测试过这段代码,因此可能需要进行一些调整才能使其正常工作。