ポート 6789 でクラス C の IP アドレスに ping を実行するコードを書きましたPING
。ポート 6789 が開いているすべての IP アドレスを取得します。しかし、私が必要としているのは、たとえば 5 秒ごとに更新 (再 ping) し、最近参加した IP が存在する場合は追加し、ポートを離れる IP を省略することです。残念ながら、別の問題が発生します。アプリケーションを起動すると、 の最初の反復がwhile (true)
完全に機能し、ポート 6789 が開いている IP が に追加され、ArrayList ips_List
に表示されますListView
。別のデバイスがポートに参加すると、私の電話はそれを に追加しますips_List
また。しかし、スレッドが 5 秒間スリープした後の 2 回目の反復で、(xxx1 - xxx254) から IP への再 ping を開始して、以前に ping された IP への ping 時に別の IP がポートに参加したかどうかを確認すると、ソケットは 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();
}
}