InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
Por que isReachable
retorna false
? Posso fazer ping no IP.
java
inetaddress
Jiafu
fonte
fonte
Respostas:
O método "isReachable" não vale a pena usar para mim em muitos casos. Você pode rolar até a parte inferior para ver minha alternativa para simplesmente testar se você está online e é capaz de resolver hosts externos (por exemplo, google.com) ... O que geralmente parece funcionar em máquinas * NIX.
O problema
Fala-se muito sobre isso:
Aqui estão outras questões semelhantes:
Detectar conexão com a Internet usando Java
Como faço para testar a disponibilidade da internet em Java?
E até mesmo um bug relatado no mesmo assunto:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4921816
Parte 1: um exemplo reproduzível do problema
Observe que, neste caso, ele falha.
Parte 2: Uma Solução Alternativa Hackish
Como alternativa, você pode fazer o seguinte:
A opção -c de ping permitirá que o ping simplesmente tente alcançar o servidor uma vez (ao contrário do ping infinito que estamos acostumados a usar no terminal).
Isso retornará 0 se o host estiver acessível . Caso contrário, você obterá "2" como valor de retorno.
Muito mais simples - mas é claro que é específico da plataforma. E pode haver certas advertências de privilégio para usar esse comando - mas acho que funciona em minhas máquinas.
POR FAVOR, observe que: 1) Esta solução não é qualidade de produção. É um pouco hack. Se o Google estiver fora do ar, ou sua internet estiver temporariamente lenta, ou talvez até mesmo se houver alguma graça em seus privilégios / configurações do sistema, ele pode retornar falsos negativos (ou seja, pode falhar mesmo que o endereço de entrada seja acessível). 2) A falha isReachable é um problema pendente. Novamente - existem vários recursos online indicando que não existe uma maneira "perfeita" de fazer isso no momento da redação deste artigo, devido à maneira como a JVM tenta alcançar os hosts - acho que é uma tarefa intrinsecamente específica da plataforma que, embora simples , ainda não foi suficientemente abstraído pela JVM.
fonte
isReachable
estou obtendo falha e usando ping estou recebendo icmp não permitido? Você sabe como lidar com isso agora?public boolean waitFor(long timeout, TimeUnit unit)
em java.lang.Process (@since 1.8)isReachable
seja mais confiável hoje em dia.Vim aqui para obter uma resposta para esta mesma pergunta, mas não fiquei satisfeito com nenhuma das respostas porque estava à procura de uma solução independente de plataforma. Aqui está o código que escrevi e é independente de plataforma, mas requer informações sobre qualquer porta aberta na outra máquina (que temos na maioria das vezes).
fonte
InetAddress.isReachable()
já faz, via porta 7, exceto que esta última é mais inteligente sobre o que as várias possíveisIOExceptions
significam em termos de acessibilidade.InetAddress.isReachable()
fosse sobrecarregado para incluir o argumento da porta, na biblioteca padrão. Eu me pergunto por que não foi incluído?Se você deseja apenas verificar se ele está conectado à internet use este método, retorna verdadeiro se a internet estiver conectada, é preferível se você usar o endereço do site que está tentando conectar através do programa.
fonte
Apenas mencionando explicitamente, já que as outras respostas não o fazem. A parte ping de isReachable () requer acesso root no Unix. E como apontado por bestsss em 4779367 :
Como usar root não era uma opção no meu caso, a solução foi permitir o acesso à porta 7 do firewall para o servidor específico no qual eu estava interessado.
fonte
Não tenho certeza de qual era o estado quando a pergunta original foi feita em 2012.
Como está agora, o ping será executado como root. Através da autorização do executável ping você verá o sinalizador + s, e o processo pertencente ao root, o que significa que será executado como root. execute ls -liat onde o ping está localizado e você deverá vê-lo.
Portanto, se você executar InetAddress.getByName ("www.google.com"). IsReacheable (5000) como root, ele deve retornar verdadeiro.
você precisa de autorizações adequadas para o soquete bruto, que é usado pelo ICMP (o protocolo usado pelo ping)
InetAddress.getByName é tão confiável quanto o ping, mas você precisa de permissões adequadas no processo para que ele seja executado corretamente.
fonte
Eu sugeriria que a ÚNICA maneira confiável de testar uma conexão com a Internet é realmente conectar E baixar um arquivo OU analisar a saída de uma chamada de ping do sistema operacional via exec (). Você não pode confiar no código de saída para ping e isReachable () é uma porcaria.
Você não pode confiar em um código de saída de ping, pois ele retorna 0 se o comando ping for executado corretamente. Infelizmente, o ping é executado corretamente se não puder alcançar o host de destino, mas obtém um "Host de destino inalcançável" de seu roteador ADSL doméstico. Este é o tipo de resposta que é tratada como uma resposta bem-sucedida, portanto, código de saída = 0. Porém, é preciso acrescentar que se trata de um sistema Windows. Não verificado * nixes.
fonte
fonte
Ou usando desta forma:
fonte
InetAddress.isReachable
é flappy, e às vezes retorna inacessível para endereços que podemos pingar.Tentei o seguinte:
ping -c 1 <fqdn>
e verifique oexit status
.Funciona para todos os casos que tentei
InetAddress.isReachable
e não funciona.fonte
Como você pode executar o ping no computador, seu processo Java deve ser executado com privilégios suficientes para realizar a verificação. Provavelmente devido ao uso de portas na faixa inferior. Se você executar seu programa java com sudo / superuser, aposto que funciona.
fonte