Ping com Socket Muito Lento. isReachable resolve?

olá pessoal, estou com um problema aqui e precisa conectar o servidor que trabalho em várias cameras em diferentes localidades, mas antes preciso verificar se todas estão on.

atualmente elas compartilham o ip com outros serviços, então tenho que “pingar” apenas a porta a da câmera.

estou usando esse exemplo aqui por enquanto, mas para ips inválidos ele tem se mostrado muito lento.

// Create a socket with a timeout

try {

    InetAddress addr = InetAddress.getByName("java.sun.com");

    int port = 80;

    SocketAddress sockaddr = new InetSocketAddress(addr, port);



    // Create an unbound socket

    Socket sock = new Socket();



    // This method will block no more than timeoutMs.

    // If the timeout occurs, SocketTimeoutException is thrown.

    int timeoutMs = 2000;   // 2 seconds

    sock.connect(sockaddr, timeoutMs);

} catch (UnknownHostException e) {

} catch (SocketTimeoutException e) {

} catch (IOException e) {

}

o método isReachable da classe InetAddress parece uma solução ideal, mas não posso setar portas neles.

alguém vê uma solução?

grato desde já.

Cara, seguinte, esse metodo não exatamente um PING que utiliza o protocolo ICMP, que é o mesmo do comando PING no prompt do windows.

Uma saida que é certo que funciona, é utilizar JNI, andei pesquisando ha um tempo atras, e encontrei soluções desse tipo, e funcionais…

Espero ter ajudado um pouco…

Abracos!

vc tem algum exemplo pra facilitar? eu so meio que iniciante só que to precisando disso com urgência, de qualquer forma já to pesquisando por aqui.

Obrigado.


//**************************************
//     
// Name: Ping in JAVA
// Description:Actually, we can't code P
//     ING implementation in JAVA. But, we can 
//     use PING command based on our system, an
//     d then catch and parse the output.
// By: yan friskan
//
//This code is copyrighted and has// limited warranties.Please see http://
//     www.Planet-Source-Code.com/vb/scripts/Sh
//     owCode.asp?txtCodeId=4559&lngWId=2//for details.//**************************************
//     

// actually this code come from
// http://forum.java.sun.com/thread.jsp?
//     forum=49&thread=190073&tstart=0&trange=1
//     5
// I'm just modified it a little. I thin
//     k this is may be usefull for beginners l
//     ike you and me :)
class tryMe {
  public static void main(String [] args) {
    String hostIP = "10.112.1.113";
    java.lang.Runtime r = java.lang.Runtime.getRuntime();

    try {
      java.lang.Process p = r.exec("ping " + hostIP);
      java.io.BufferedReader br = new java.io.BufferedReader(            				new java.io.InputStreamReader(p.getInputStream()) );
      String l = "";

      try {
        while((l = br.readLine()) != null) {
          if(l.startsWith("Reply from"))
            System.out.println("LIFE -->" + l);
          if(l.startsWith("Request timed out"))
            System.out.println("DIES -->" + l);
        }
      } catch(java.io.IOException ioe) {
        ioe.printStackTrace();
      }
    } catch(java.io.IOException ioe) {
      ioe.printStackTrace();
    }
  }
}

Esse codigo esta pronto… o que ele faz é simplesmente executar o PING do windows e ler o que ele retorna. :razz:

Mas como o mundo nem sempre é azul, tu fica com o problema da portabilidade, mas isso tu pode controlar, sabendo qual Sistema Operacional tu ta rodando, e executar o “PING” desse SO.

Era isso cara?

Amigo, nem sei se vem ao caso, mas outra coisa que vc pode fazer, é ir no promp e executar o comando:

se for windows:

tracert endereçoHost

se for Linux

traceroute endereçoHost

Ele vai traçar a rota até o ponto que vc deseja. Dá pra vc ver, se é o seu programa que está lento ou se está tendo problema na transmissão (na rede), como um roteador sobrecarregado, demora de resposta, etc…

Falows?