我正在寻找一种方法来获取 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.1
到 192.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/