• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

MagicCell

Fazer ping a um servidor

8 mensagens neste tópico

Olá gente!

Eu estava a tentar fazer um programa para fazer ping ao servidor que o utilizador introduz no textfield de nome 'text'.

Eu tive a pesquisar na net sobre como fazer isso e descobri que apartir do jdk 1.5 existe o método "isReachable()" que é parecido com o ping, mas acho que usa portas específicas para verificar se o servidor está "alcançável". Os métodos 'getHostName()' e 'getHostAddress()' funcionam bem, no entanto devolve-me sempre 'false' no método 'isReachable()' sempre que tento fazer o ping, mesmo para a própria rede.

Se alguém me poder dar uma opinião sobre este código ou de outra maneira para fazer o ping, agradecia.

Obrigado em adiantado!

Aqui vai o código:

    private void pingar() {
       String ip = text.getText().substring(14);

       try {
           InetAddress address = InetAddress.getByName(ip);
           System.out.println("Name: " + address.getHostName());
           System.out.println("Addr: " + address.getHostAddress());
           System.out.println("Reach: " + address.isReachable(3000));
       } catch (UnknownHostException e) {
           System.err.println("Não foi possível encontrar esse servidor");
       } catch (IOException e) {
           System.err.println("Não foi possível pingar o servidor");
       }
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Essa porta 3000 está aberta no servidor ?? ou Tens alguma firewall ligada ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

System.out.println("Reach: " + address.isReachable(3000));

Este '3000' não é uma porta, é o timeout.

Já desliguei a firewall do vista, mas continua sem funcionar :S

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse método utiliza a port 7 ou seja a porta do ECHO o mais provavel será estar qq coisa a bloquear o acesso à porta.

Penso que se queres algo que realmente saiba se o servidor está up é ires fazendo ligações porta a porta até encontrar uma aberta. Não é algo muito subtil mas assim garante-te resultados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm, então vou ter que trabalhar com sockets.

Alguma dica ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pensei que fosse mais difícil :-[

Obrigado pela ajuda ;)

Fica bem :D

Quando acabar ou se tiver mais problemas, comunico :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui tem um exemplo de uma calculadora utilizando socket, acho q isso vai te ajudar ai.

Cliente

/*
* CalcClient.java
*
* Created on 31 de Março de 2007, 18:37
*/

import java.io.*;
import java.net.*;


public class CalcClient {
        
    public static void main(String args[]){
        
        int num1, num2;
        char oper;
        double resultado;
        
        try{            
            
            //Solicita um socket ao servidor. Deve existir um socket esperando no lado do servidor;
            Socket conexao = new Socket("LocalHost", 5000);            

            //Cria os canais de comunicação com o servidor;
            DataInputStream in = new DataInputStream(conexao.getInputStream());
            DataOutputStream out = new DataOutputStream(conexao.getOutputStream());

            //Cria objeto de leitura do console (teclado);
            BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));            
            
            //Cria interface com console (teclado) e lê dados do console (teclado);
            System.out.println("Sequencia esperada: Num1 (inteiro) + operador (+, -, ., /) + Num2 (inteiro)");
            System.out.print("\nNum1 > " );
            num1 = Integer.parseInt(teclado.readLine());
            System.out.print("Oper > " );
            oper = teclado.readLine().charAt(0);
            System.out.print("Num2 > " );
            num2 = Integer.parseInt(teclado.readLine());            
            
            //Envia dados lidos do console (teclado) para o servidor através do canal de saída (out);
            out.writeInt(num1);
            out.writeChar(oper);
            out.writeInt(num2);
            
            //Recebe do servidor o resultado da operação solicita;
            resultado = in.readDouble();            
            System.out.println("----------");
            System.out.println("resultado > " + resultado);

        }catch(IOException e){            
            System.out.println("IOException: " + e);
            System.exit(1);
        }
        
        
    }
    
}

Servidor

/*
* CalcServer.java
*
* Created on 31 de Março de 2007, 11:07
*/

import java.io.*;
import java.net.*;
import java.util.*;



public class CalcServer extends Thread{
    
    private static ServerSocket ss = null;
    private static Socket conexao = null;    
    
    public CalcServer(Socket _s) {
        this.conexao = _s;
    }
    
    public void run(){        
        
        int num1, num2;
        char oper;
        double resultado;
        
        try{         
            
            //Cria objetos que controlam o fluxo de comunicação;            
            DataInputStream in = new DataInputStream(conexao.getInputStream());
            DataOutputStream out = new DataOutputStream(conexao.getOutputStream());            
            
            //Recebe valores a serem calculados;
            num1 = in.readInt();                                    
            oper = in.readChar();           
            num2 = in.readInt();            
            
            //Calcula o resultado da operação desejada pelo cliente;
            resultado = calculaValor(num1, oper, num2);
            
            //Envia para o cliente o resultado da operação;
            out.writeDouble(resultado);            
            
            //Encerra os canais de comunicação e o socket com o cliente;
            in.close();
            out.close();
            conexao.close();
            
        }catch(IOException e){
            System.out.println("IOException: " + e);            
        }
        
    }
    
    //Recebe os valos recebidos do cliente e retorna o double com o resultado;
    public double calculaValor(int _num1, char _oper, int _num2){        
        
        double _resultado = 0.0;                
        switch(_oper){
            case '+':
                _resultado = _num1 + _num2;
                break;
            case '-':
                _resultado = _num1 - _num2;
                break;
            case '.':
                _resultado = _num1 * _num2;
                break;
            case '/':
                _resultado = _num1 / _num2;
                break;
        }        
        return _resultado;
        
    }
    
    public static void main(String args[]){
        
        try{                        
            //Cria o ServerSockets;
            ss = new ServerSocket(5000);                                            
            while(true){                
                System.out.println("Esperando conexao do cliente...");
                //Cria o Socket e espera por conexões;
                Socket s = ss.accept();                                
                //Cria Thread para socket com um cliente. Passa o socket estabelecido para o método construtor;
                Thread t = new CalcServer(s);
                t.start();                
                //Volta ao loop para esperar mais concexões;
            }                       
            
        }catch(IOException e){
            System.out.println("IOException: " + e);
            System.exit(1);
        }
        
        
    }
    
    
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora