最近做的项目要网络监测,看能不能ping通下位机,可让我一顿好找。因为我用模拟器测试的,发现电脑用cmd可以ping通,但是用软件就死活不行,下位机一直说必须用ping命令。下面直接上代码:
public class Ping extends AsyncTask<String, Boolean, Boolean> {
@Override
protected Boolean doInBackground(String... strings) {
try {
Process p = Runtime.getRuntime().exec("ping -c 1 -w 3 " + strings[0]);
InputStream input = p.getInputStream();
InputStreamReader isr = new InputStreamReader(input);
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder builder = new StringBuilder();
while ((line = br.readLine()) != null) {
builder.append(line);
}
br.close();
isr.close();
input.close();
br.close();
Logger.i("返回的数据:"+builder+" 对比:"+builder.toString().contains("ttl"));
/*如果Ip地址Ping成功后数据里面会有ttl这个数据,所以对比这个字符串即可*/
return builder.toString().contains("ttl");
} catch (MalformedURLException e) {
Logger.e(e.toString());
return false;
} catch (IOException e) {
Logger.e(e.toString());
return false;
}
}
@Override
protected void onPostExecute(Boolean isPing) {
Logger.v("Ping的结果:" + isPing);
if (isPing) {
BaseActivity.number = 0;
} else {
Logger.d("失败" + BaseActivity.number);
BaseActivity.number++;
if (BaseActivity.number > 3) {
BaseActivity.in(BaseActivity.number);
}
}
}
}
使用方法
new Thread(new Runnable() {
@Override
public void run() {
//需要在子线程中处理的逻辑
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Ping().execute("192.168.88.82");
}
}
}).start();