如何在Android中扫描IP
Posted
技术标签:
【中文标题】如何在Android中扫描IP【英文标题】:How to scan IP in Android 【发布时间】:2016-07-16 15:09:19 【问题描述】:我想创建一个“简单”的应用程序来查找给定网络中的所有 IP 地址..
例如……
我有一个按钮,点击后,可以找到所有 IP 地址并在 ListView 中显示它们。
有人有示例或功能源代码可以解释如何做吗?
对不起我的英语 =)
【问题讨论】:
以下网址可能对您有所帮助***.com/questions/3345857/… 【参考方案1】:这是我在本地网络中查找 IP 地址的代码。
首先,您必须找到您的设备 IP 地址,然后使用该 IP 地址的subnet
ping 每个 IP 地址。假设设备 IP 地址为192.168.0.100
,则本地subnet
为192.168.0.
。然后从192.168.0.1
ping 每个IP 地址到192.168.0.255
以查找设备的IP 地址,您可以使用两种方法:
1 方法:
String ip = "";
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface.getNetworkInterfaces();
while(enumNetworkInterfaces.hasMoreElements())
NetworkInterface networkInterface = enumNetworkInterfaces.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses();
while(enumInetAddress.hasMoreElements())
InetAddress inetAddress = enumInetAddress.nextElement();
String ipAddress = "";
if(inetAddress.isSiteLocalAddress())
ipAddress = "SiteLocalAddress: ";
ip += ipAddress + inetAddress.getHostAddress() + "\n";
String subnet = getSubnetAddress(ip);
private String getSubnetAddress(int address)
String ipString = String.format(
"%d.%d.%d",
(address & 0xff),
(address >> 8 & 0xff),
(address >> 16 & 0xff));
return ipString;
2 方法:
WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();
String subnet = getSubnetAddress(mWifiManager.getDhcpInfo().gateway);
找到子网地址后,ping网络中的每个IP地址:
private void checkHosts(String subnet)
try
int timeout=5;
for (int i=1;i<255;i++)
String host=subnet + "." + i;
if (InetAddress.getByName(host).isReachable(timeout))
Log.d(TAG, "checkHosts() :: "+host + " is reachable");
catch (UnknownHostException e)
Log.d(TAG, "checkHosts() :: UnknownHostException e : "+e);
e.printStackTrace();
catch (IOException e)
Log.d(TAG, "checkHosts() :: IOException e : "+e);
e.printStackTrace();
在 ping 每个 IP 地址之后,android 内核文件会存储那些在网络中的 IP 地址。您可以通过调用 AndroidOS 文件获取此列表。这个文件是arp
,它存储在android中的/proc/net/
中。您可以通过代码进入。只需以编程方式执行特定命令并将其存储在您的模型数据中,然后通过适配器通知您的 listView:
ArrayList<IpAddress> mIpAddressesList;
private boolean getIpFromArpCache()
BufferedReader br = null;
char buffer[] = new char[65000];
String currentLine;
try
br = new BufferedReader(new FileReader("/proc/net/arp"));
while ((currentLine = br.readLine()) != null)
Log.d(TAG, "getIpFromArpCache() :: "+ currentLine);
String[] splitted = currentLine.split(" +");
if (splitted != null && splitted.length >= 4)
String ip = splitted[0];
String mac = splitted[3];
if (!splitted[3].equals(emptyMac))
if (!splitted[0].equals(IP))
// int remove = mac.lastIndexOf(':');
// mac = mac.substring(0,remove) + mac.substring(remove+1);
mac = mac.replace(":", "");
Log.i(TAG, "getIpFromArpCache() :: ip : "+ip+" mac : "+mac);
mIpAddressesList.add(new IpAddress(ip, mac));
return true;
catch (Exception e)
e.printStackTrace();
finally
try
br.close();
catch (IOException e)
e.printStackTrace();
return false;
public class IpAddress
private String ipAddressName;
private String macAddress;
public IpAddress(String ipAddressName, String macAddress)
setIpAddressName(ipAddressName);
setMacAddress(macAddress);
public void setIpAddressName(String ipAddressName)
this.ipAddressName = ipAddressName;
public String getIpAddressName()
return this.ipAddressName;
public void setMacAddress(String macAddress)
this.macAddress = macAddress;
public String getMacAddress()
return this.macAddress;
但是在主线程上执行这些网络操作并不好。您必须将所有代码推送到线程上。并在后台线程上执行所有与网络相关的问题。希望它可以帮助你。让我知道天气是否有效。
如果你需要我想分享这个演示的.apk
。
【讨论】:
可以有apk文件还是工程?如果不烦人。我不明白的事情 我也有演示项目和 apk 文件。但是你有什么不明白的? 请把apk和项目传给我好吗?我会更好地理解..这不是问题..我不明白的是如何将找到的所有IP地址放在列表视图中 能否提供您的电子邮件地址? developer@copyworld.it【参考方案2】:你可以试试这样的:
public class MainActivity extends Activity
WifiManager wifi;
String wifis[];
WifiScanReceiver wifiReciever;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wifi=(WifiManager)getSystemService(Context.WIFI_SERVICE);
wifiReciever = new WifiScanReceiver();
wifi.startScan();
protected void onResume()
registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
super.onResume();
private class WifiScanReceiver extends BroadcastReceiver
public void onReceive(Context c, Intent intent)
List<ScanResult> wifiScanList = wifi.getScanResults();
wifis = new String[wifiScanList.size()];
for(int i = 0; i < wifiScanList.size(); i++)
wifis[i] = ((wifiScanList.get(i)).toString());
//here you can set your list view with wifis
【讨论】:
以上是关于如何在Android中扫描IP的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有安装 MQTT 应用程序的设备的情况下在 android 上使用 MQTT 将消息推送到特定 IP?
如何通过zxing-android-embedded在Android中停止连续扫描
如何在 android zxing 中扫描带有嵌入权重的条码