gpt4 book ai didi

android - 在 Android 中 Ping 一个 IP 列表

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:14 29 4
gpt4 key购买 nike

我正在编写一个安卓应用程序。

当单击“自动扫描”按钮时,我有一项 Activity 负责 Pinging 254 IPv4 并将连接的机器放入数据库表中(放置 ip)。//-------------------------------------------- ----------------------

首先我获得本地 IP(例如 192.168.1.8),然后当单击按钮时,我从 ip(例如 192.168.1.)中提取一个子字符串,然后开始 ping 从“192.168.1”开始的所有 IP。 1.1"并以“192.168.1.254”结尾。每次 ping 后,我都会进行测试以了解该 ping 是成功还是失败,如果成功则将该 ip 放入数据库表中,最后我在 ListView 中显示连接的 IP 列表。//-------------------------------------------- ----------------------

问题是 Pinging 任务完成时间太长(大约 15 分钟或更长时间!!),这太疯狂了。我尝试使用 InetAddress.isReachable() 它速度很快,但它找不到使用 Windows 的计算机,所以我改为使用 Process & Runtime.getRuntime().exec(cmd)。

在安卓代码下面:

class MyTask extends AsyncTask<String, Integer, Void> {         

Dialog dialog;
ProgressBar progressBar;
TextView tvLoading,tvPer;
Button btnCancel;

@Override
protected Void doInBackground(String... params) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

String s="", address = params[0];
int index=0,j=0,count=0;

//on prend le dernier index du char "."
final StringBuilder ss = new StringBuilder(address);
index = ss.lastIndexOf(".");
//on prend une souschaîne qui contient l'ipv4 sans le dernier nombre
s = address.substring(0,index+1);

//Tester tous les adresses Ipv4 du même plage d'adresses
for(int i=1; i<255; i++){
if (isCancelled()) {
break;
}
if(testping(s+""+i+"")){
insertIPv4(s+""+i+"");}
count++;
if(count == 5 && j<100){
count=0;
j+=2;
publishProgress(j);
}
}
return null;
}

@Override
protected void onPostExecute(Void result){
super.onPostExecute(result);

dialog.dismiss();

AlertDialog alert = new AlertDialog.Builder(Gestion_Machines.this)
.create();

alert.setTitle("Terminé");
alert.setMessage("Operation Terminé avec Succés");
alert.setButton("OK", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alert.show();
}

@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new Dialog(Gestion_Machines.this);
dialog.setCancelable(false);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.progressdialog);

progressBar = (ProgressBar) dialog.findViewById(R.id.progressBar1);
tvLoading = (TextView) dialog.findViewById(R.id.tv1);
tvPer = (TextView) dialog.findViewById(R.id.tvper);
btnCancel = (Button) dialog.findViewById(R.id.btncancel);

btnCancel.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
objMyTask.cancel(true);
dialog.dismiss();
}
});

dialog.show();
}

@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
tvLoading.setText("Loading... " + values[0] + " %");
tvPer.setText(values[0]+" %");
}
}

和使 ping 的方法:

public boolean testping(String x){
int exit=22;
Process p;

try {
//.....edited line.....
p = Runtime.getRuntime().exec("ping -c1 -W1 "+x);
//make shure that is -W not -w it's not he same.
p.waitFor();
exit = p.exitValue();
p.destroy();
} catch (IOException ee) {
ee.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (exit == 0) {
return true;
}else{
return false;
}
}

最佳答案

我在网上搜索,我发现在 java 中,有些人使用了一个名为“fping”的命令,它接受以毫秒为单位的超时选项 (-t)。但是 android ( shell ) 中的 ping 命令只能接受秒超时。所以,就我而言,打洞操作应该需要 254 秒,还不错....但并不完美。

public boolean testping(String x){
int exit=22;
Process p;

try {
//.....edited line.....
p = Runtime.getRuntime().exec("ping -c1 -W1 "+x);
//make shure that is -W not -w it's not he same.
p.waitFor();
exit = p.exitValue();
p.destroy();
} catch (IOException ee) {
ee.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (exit == 0) {
return true;
}else{
return false;
}
}

关于android - 在 Android 中 Ping 一个 IP 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com