Detectar conexão com a Internet usando o Java

Duplicar Possível:
Como verificar se a conexão com a internet está presente em java?

Eu quero ver se alguém tem uma maneira fácil de detectar se há uma conexão com a Internet ao usar o Java. O aplicativo atual usou o método “InternetGetConnectedState” na DLL WinInit para windows, mas meu aplicativo precisa ser multi-plataforma para a operação do mac e desta forma não funcionará. Eu não sei JNI em tudo, quer usar DLLs em Java e tornou-se frustrante rápido.

Apenas as maneiras que eu poderia pensar estavam tentando abrir uma conexão de URL para um site e, se isso falhar, retornar false. Meu outro caminho está abaixo, mas eu não sabia se isso era geralmente estável. Se eu desconectar meu cabo de rede, recebo uma UnknownHostException ao tentar criar o InetAddress. Caso contrário, se o cabo estiver conectado, recebo um object InetAddress válido. Eu não testei o código abaixo em um mac ainda.

Obrigado por qualquer exemplo ou conselho que você possa fornecer.

ATUALIZAÇÃO: O bloco de código final está na parte inferior. Eu decidi seguir o conselho de uma solicitação HTTP (neste caso, o Google). É simples e envia uma solicitação ao site para que os dados sejam retornados. Se não consigo obter nenhum conteúdo da conexão, não há internet.

public static boolean isInternetReachable() { try { InetAddress address = InetAddress.getByName("java.sun.com"); if(address == null) { return false; } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } return true; } 

Bloco final de código:

 //checks for connection to the internet through dummy request public static boolean isInternetReachable() { try { //make a URL to a known source URL url = new URL("http://www.google.com"); //open a connection to that source HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection(); //trying to retrieve data from the source. If there //is no connection, this line will fail Object objData = urlConnect.getContent(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } return true; } 

Essa é uma abordagem perfeitamente razoável para resolver o problema. O ruim é que você está realmente testando o DNS ao invés de testar toda a rede, mas na prática você pode frequentemente lidar com isso como equivalente.

A outra coisa a lembrar, é que você precisará definir uma propriedade do sistema para desativar o cache do DNS no tempo de execução do Java. Caso contrário, ele pode continuar relatando que a rede está baseada em dados armazenados em cache (mesmo que esteja inativa).

Outra abordagem seria realmente abrir uma solicitação HTTP para algum endereço de rede como este de vez em quando.

Devo acrescentar que, embora o bloco de código final dado acima seja bom, ele tem uma falha – é possível que demore muito tempo para entrar em contato com o endereço especificado, mas o endereço ainda está acessível.

Na minha instância, ao testar com um endereço, o método retornaria verdadeiro, mas levaria 10 segundos ou mais para obter uma resposta. Nesse caso, o servidor estava acessível, mas não para qualquer finalidade útil, pois a conexão era muito lenta. Isso ocorre porque o tempo limite padrão para HttpURLConnection é 0 ou infinito.

Por esse motivo, recomendo que você faça a verificação do thread da interface do usuário e adicione urlConnect.setConnectTimeout(1000); antes de chamar urlConnect.getContent();

Desta forma, você sabe que o endereço é acessível e que não levará 5 anos para baixar um arquivo de 10k.

(Você pode, claro, querer alterar o tempo limite para atender às suas necessidades)

Também recomendo não verificar um endereço genérico (google.com etc), a menos que seu programa geralmente acesse mais do que alguns domínios. Se você acabou de acessar um ou dois, verifique esse domínio.

Note que poderia retornar false se o java.sun.com não estivesse respondendo! Nesse caso, você deve verificar outro site para ter certeza.

Não testei isso, mas sugiro que você procure em java.net.NetworkInterface.getNetworkInterfaces (). Isso retorna uma Enumeração de todas as interfaces de rede na máquina ou nulo, se não houver nenhum.

Não tenho certeza se é seguro assumir que uma resposta não nula garante uma conexão de rede válida – dependendo de suas necessidades, você pode ou não precisar filtrar os endereços de loopback (o que eu acho que você poderia fazer com java.net .NetworkInterface.getInetAddresses () em cada NetworkInterface retornada e, em seguida, chamando InetAddress.isLoopbackAddress () em cada um deles.)

A única maneira de ser CERTO que você pode alcançar um determinado serviço, é fazer uma solicitação simulada a esse serviço. Pings podem ser bloqueados por firewalls. Alguns servidores podem ser acessados, outros não. Se você precisar conversar com um serviço da Web, tenha uma página estática para retornar a essas solicitações.

Além disso, lembre-se de perguntar ao usuário antes de tentar entrar em contato.

A questão não tem realmente um significado. Não existe uma conexão com a Internet. Você tem que tentar criar um. A API do Windows mencionada apenas informa se o seu modem foi discado ou não, e eu vi isso realmente causar discagens, o que não é exatamente a ideia. Não que eu tenha tido uma discagem nos últimos 8 anos ou mais.

Um problema com a primeira solução é que o InetAddress tem um cache, portanto, quando você perder a conexão para a próxima chamada, o nome será resolvido por meio do cache java. Com a abordagem de conexão de URL, você tem o problema de usar o getContent que deve buscar o html para que haja um consumo de dados. Se as invocações são feitas com muita freqüência, isso pode ser um problema (ainda mais se você não tiver um plano de dados ilimitado no dispositivo que executa o software).

Acho que a melhor solução seria fazer uma conexão TCP com a porta 80 e fechá-la imediatamente depois de uma conexão bem-sucedida. Isso se comportaria como o código final, mas teria muito menos tráfego.

    Intereting Posts