java - 如何在android中根据LAN上相应的主机名获取IP

标签 java android ip lan

我正在寻找一种方法来获取 LAN 中已知主机名的 IP 地址。

我的工作方式是执行网络扫描,扫描从192.168.1.1开始到192.168.1.255,所以我尝试了InetAddress.getHostName()InetAddress.getCanonicalAddress()但检索到相同的IP地址。

我尝试使用 nslookup 进行扫描。它在java编译器中完美运行,但在android中不可能..

由于编译标题时出现错误,我无法测试 dnsjava 库:NoClassDefFoundError,文件 dnsjava-2.1.7.jar 已添加到 libs 目录中。

有什么帮助吗? *抱歉我的英语不好。

最佳答案

我已经编写了一个有效的代码(至少出于我的目的)。

我已经对我的微 Controller (ESP8266-NodeMCU) 进行了编程,以写回携带 JSON 对象的 HTML 响应。

因此,我通过向从 192.168.1.1192.168.1.255 的每个地址写入 http 请求来扫描我的网络。

注释:

  • 我使用了 SyncHttpClient 因为我需要扫描大量地址。我尝试过 AsyncHttpClient 但它没有捕获响应。
  • 我尝试过 (InetAddress.isReachable()) 方法来过滤地址,但它不起作用,因为它总是返回 false
  • 如果不在请求中添加至少 1 个查询参数,我就无法创建 HttpRequest。

    boolean found = false;
    
    void getIPAddress()  {
    
      for (int i = 1; i < 255; i++) {
        if (!found) {
            String tryIP = subnet + String.valueOf(i);
            Log.d(TAG, "Trying: " + tryIP);
            final String finalIP = tryIP;
    
            try {
    
                    SyncHttpClient client = new SyncHttpClient();
                    RequestParams params = new RequestParams();
                    params.put("check", "1");
    
                    client.get("http://" + finalIP , params, new JsonHttpResponseHandler() {
    
    
    
                        @Override
                        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                            try {
    
                                JSONObject jo = response;
                                String key = jo.getString("controller");
                                Log.d(TAG, "Success : " + response + " and key is : " + key);
    
                                if (key.equals("esplight")) {
    
                                    Log.d(TAG, "Found the ESP! Its IP is :" + finalIP);
    
                                    found = true;
    
    
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
    
                        }
    
                        @Override
                        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
    
                            Log.d(TAG, "trying to connect failed ");
    
                        }
                    });
    
    
              } catch (Exception e) {
            }
        }
     }
    }
    

关于java - 如何在android中根据LAN上相应的主机名获取IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310677/

相关文章:

生成的 java tomcat 链接不起作用

java - LibGdx 书中的 gradle 代码有问题吗?

java - 如何在 ubuntu 14.04 x64 上使用 subclipse 和 eclipse kepler?

android - 我怎样才能为我的 Android 应用程序获得可怕的 WRITE_SECURE_SETTINGS 权限?

node.js - 通过 Cloudflare 获取 NODE.JS 上的客户端 IP

java - 如何在每个 ListView 行上显示左彩色边框?

android - 在 InApp 计费库 [android] 的响应中检测测试购买

java - 当 App 在 Oreo 中被杀死时广播接收器不工作为什么?

linux - 如何将多个 IP 地址映射到单个服务器的文件

c - 使用 TCP/IP : recv() blocks 的套接字编程