http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping-the-ip-address
仕方がないのでpingをコマンドライン経由で打つ羽目に.かなりいい加減な実装だがまあ最初のイテレーション(だけ)ではよいとする.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * Created by neko32 on 2016/09/11. */ public class Ping { private String resultCache = null; private static final Logger LOG = LoggerFactory.getLogger(Ping.class); public boolean isReachable() { if(resultCache == null) throw new IllegalStateException("run start() first"); LOG.debug(resultCache); boolean decision = false; decision = resultCache.contains("(0%"); if(resultCache.contains("unreachable") || resultCache.contains("到達できません") || resultCache.contains("timeout") || resultCache.contains("タイムアウト")) { decision = false; } return decision; } public void start(final String destIP) throws IOException { final String cmd = String.format("ping %s", destIP); Process p = Runtime.getRuntime().exec(cmd); StringBuilder sb = new StringBuilder(); try(InputStreamReader is = new InputStreamReader(p.getInputStream(), "MS932"); BufferedReader br = new BufferedReader(is)) { String line = null; while((line = br.readLine()) != null) { sb.append(line); } } resultCache = sb.toString(); } }こちらはそのユニットテスト.
mport org.scalatest.{GivenWhenThen, FeatureSpec} import org.tanuneko.im.net.util.Ping /** * Created by neko32 on 2016/09/11. */ class PingSpec extends FeatureSpec with GivenWhenThen { info("Ping is a small utility to run ping through command line.") info("Because InetAddress.isReachable() doesn't rely on actual ping but ECHO(TCP 7), not reliable") feature("Ping") { scenario("Ping succeeds against known ip address(local loopback)") { When("Ping is executed") val ping = new Ping ping.start("127.0.0.1") Then("Ping should succeed") assert(ping.isReachable) } } feature("Ping") { scenario("Ping fails against unknown ip address") { When("Ping is executed") val ping = new Ping ping.start("3.99.156.254") Then("Ping should fail") assert(!ping.isReachable) } } }