您好,感谢您的期待。
我希望能够从Android应用程序同时ping多个IP地址。我已经编写了下面的代码,希望能够打电话给我的" Ping Something"方法在不同的线程上多次。如果我这样做的话,结果都会相互干扰,基本上最后运行的线程会覆盖所有其他线程。实现目标的最佳方式是什么?即能够从Android应用程序ping多个IP地址,而无需等待以前的结果完成。
非常感谢您提前提供任何帮助。
纳特
这可以通过计时器或按下按钮来调用.......
new Thread(new Runnable() {
public void run() {
PingSomething("www.bbc.co.uk");
}
}).start();
new Thread(new Runnable() {
public void run() {
PingSomething("someotherip");
}
}).start();
new Thread(new Runnable() {
public void run() {
PingSomething("anotherip");
}
}).start();
这是我在某种程度上简化的方法......
public void PingSomething (String ahost) {
String pingResult;
Boolean noresponse, response;
String inputLine;
InetAddress theaddress;
try {
theaddress = InetAddress.getByName(ahost);
ahost = theaddress.getHostAddress();
} catch (UnknownHostException e) {
ahost = "noip";
}
String pingCmd = "ping -c 1 -t 5000 -w 1 -W 1 " + ahost;
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(pingCmd);
BufferedReader in = new BufferedReader(new
InputStreamReader(p.getInputStream()));
inputLine = "";
pingResult = "";
while ((inputLine = in.readLine()) != null) {
pingResult = pingResult + (inputLine + "\n");
}
// Do something with pingResult
final String temppingresults = pingResult;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), temppingresults, Toast.LENGTH_SHORT).show();
}
});
}
答案 0 :(得分:0)
每个线程都使用相同的变量。因此,线程1/2/3正在并发运行,但它们都写入相同的变量,因此最后终止的线程最终将是写入变量的最后一个。您需要创建新方法,每个线程一个。
例如,PingSomething
,PingSomething2
和PingSomething3
,每个都有自己的方法和变量。例如,PingSomething2
将具有以下变量:
String pingResult2;
Boolean noresponse2, response2;
String inputLine2;
InetAddress theaddress2;
依此类推。
答案 1 :(得分:0)
对我来说:ping -c 1 -t 5000 -w 1 -W 1
给出关于ttl超出范围的错误
试试这个:
String[] commands = {"ping host1 &","ping host2 &" };
runAsRoot(commands);
public void runAsRoot(String[] cmds){
Process p;
try {
p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : cmds) {
os.writeBytes(tmpCmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
p.waitFor();
Log.d("URL" ,"su commands success");
} catch (IOException e) {
Log.d("URL" ,"su command failed");
} catch (InterruptedException e) {
Log.d( "URL" ,"su command failed (waitfor failed)" );
e.printStackTrace();
}
}
直接从管道读取或尝试重定向输出,如果您需要输出ping的结果
ping -q -c 1 google.com> / dev / null 2> / dev / null&&在线回音|| echo offline
后者阅读该日志或您的选择
你可以替换' su'用' sh'在p = Runtime.getRuntime()。exec(" su"),你和root用户一起运行。如果您添加'&' (" ping host1&")ping将在后台运行并且所有ping都在同一时间运行,因此您可以在bacgkround中运行尽可能多的ping,并且可以将每个ping重定向到日志文件并从java代码中读取该日志文件。