我编写了这段代码用于在端口 6789 上 ping C 类 IP 地址,当我单击一个名为PING
. 它将检索所有打开端口 6789 的 IP 地址。但我需要的是每隔 5 秒刷新一次(重新 ping 一次),并添加最近加入的 IP(如果存在)并忽略离开端口的 IP。不幸的是,出现了另一个问题。当我启动应用程序的第一次迭代时while (true)
,它完美地工作,它添加了任何打开端口 6789 的 IP,ArrayList ips_List
然后将其显示在 上ListView
,当另一个设备加入该端口时,我的手机会将其添加到ips_List
还。但是在线程休眠 5 秒后的第二次迭代中,然后开始从 (xxx1 - xxx254) 重新 ping IP,以查看在 ping 到先前 ping 的 IP 时是否有另一个 IP 加入了端口,Socket 将抛出 IOException(如写在代码中)。
为什么会这样?
Thread pingo = new Thread(new Runnable() {
public void run() {
while (true) {
if (readableNetmask.equals("255.255.255.0")) {
for (int i = 2; i <= 25; i++) {
String ip_address = readableIPAddress;
String oct1 = "", oct2 = "", oct3 = "", oct4 = "";
StringTokenizer stok = new StringTokenizer(
ip_address, ".");
while (stok.hasMoreTokens()) {
oct1 = stok.nextToken();
oct2 = stok.nextToken();
oct3 = stok.nextToken();
oct4 = stok.nextToken();
}
to_ping_ip = oct1 + "." + oct2 + "." + oct3
+ "." + String.valueOf(i);
if (pingAddress(to_ping_ip, 6789)) {
ips_List.add(to_ping_ip);
}
}
}
// delay 10 seconds, then re-ping
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
break;
}
handler.post(new UpdateIPListViewRunnable());
}
}
});
pingo.start();
PingAddress() 函数:
public boolean pingAddress(String ip, int port) {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(ip, port), 200);
socket.close();
} catch (IOException e) {
return false;
}
return true;
}
列出地址出现的位置:
static public class UpdateIPListViewRunnable implements Runnable {
public void run() {
arrayAdapter.clear();
for (int i = 0; i < ips_List.size(); i++) {
arrayAdapter.add(ips_List.get(i));
arrayAdapter.notifyDataSetChanged();
}
ips_List.clear();
}
}