11

割り当てとして、LAN上で生きているすべてのコンピューターを見つける必要があります。クラスisReachableの関数を使用しています。InetAddressしかし、問題は、私が到達できるものが何も示されていないことです。だから私はisReachableグーグルのIPを使ってみましたが、それでもこれには到達できません。

コードは次のとおりです。

import java.net.*;

public class alive{
    public static void main(String args[]){
        try{
            InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104});
            boolean b = ia.isReachable(10000);
            if(b){
                System.out.println("Reachable");
            }
            else{
                System.out.println("Unrachable");
            }

        }catch(Exception e){
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

出力は:Unreachable

4

3 に答える 3

5

isReachable() が常に期待どおりに機能しない場合がある理由の詳細を次に示します。

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

正しい方法は、ICMPプロトコルを使用することです。これはpingが内部的に使用しているものだと思います。以下は、開始するための例です。

于 2011-01-24T06:57:54.237 に答える
4

これはプラットフォームに依存しないコードですが、他のマシン (ほとんどの場合) で開いているポートに関する情報が必要です。

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try {
        try (Socket soc = new Socket()) {
            soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        }
        return true;
    } catch (IOException ex) {
        return false;
    }
}
于 2015-12-11T18:47:47.427 に答える
3

興味深い解決策を見つけました。アプリケーションをルートとして実行できない場合は、Java で raw ソケット機能を設定できます。

sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java

そして、TCP ポート 7 でエコー要求の代わりに ICMP プロトコルが使用されます。

于 2015-07-03T15:00:49.380 に答える