Pingando em Java

7 respostas
C

Pessoal, é o seguinte:

Eu estou precisando fazer um sistema de Ping em um Hostname, da seguinte forma:

É passado o hostname, ele localiza o IP desse hostname, e executa 20 testes de ping… Exibindo todos os dados, da mesma forma que é feito em DOS.
Depois de executar os 20 pings, ele faz uma média do tempo de resposta e exibe o resultado em um textfield…

Caso não localize o hostname, exiba uma mensagem no textfield, informando que não foi encontrado…

Para exemplificar, ao efetuar o ping do “www.uol.com.br”, gostaria que ele exibisse o resultado:

Disparando contra www.uol.com.br [200.221.2.45] com 32 bytes de dados:

Resposta de 200.221.2.45: bytes=32 tempo=57ms TTL=251
Resposta de 200.221.2.45: bytes=32 tempo=28ms TTL=251
Resposta de 200.221.2.45: bytes=32 tempo=85ms TTL=251
Resposta de 200.221.2.45: bytes=32 tempo=60ms TTL=251

Estatísticas do Ping para 200.221.2.45:
Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda),
Aproximar um número redondo de vezes em milissegundos:
Mínimo = 28ms, Máximo = 85ms, Média = 57ms

Isso parece ser bastante complicado… Dei uma olhada por ai sobre InetAddress, isReachable… mas fiquei bastante confuso sobre como pegar tempo de resposta, etc…

Poderia me dar uma luz??

7 Respostas

P

Fala cara…tudo certinho?

Com a InetAdress, eu acredito que vc não vai conseguir pegar a resposta do servidor pq ele só vai vewrificar se o servidor está respondendo ou não.

A utilização é bem simples: InetAddress.getByName(IP_OU_HOST).isReachable(TEMPO_TIMEOUT)

O tempo de timeout é calculado em milisegundos!

Para vc pegar a resposta do servidor, sugiro que vc use as api Scanner e Runtime. Com a Runtime, vc vai trabalhar dessa maneira:

Runtime.getRuntime().exec(“cmd /c ping localhost”).getInputStream()

E o scanner vai receber esse inputstream que ele vai retornar:

Scanner scanner = new Scanner(Runtime.getRuntime().exec("cmd /c ping localhost").getInputStream());

Depois disso, vc cria um loop para ir lendo as linhas do scanner e vai jogando o resultado em um System.out.println(seu_atributo_string + “\n”);.

Vai postando ai q eu te ajudo :slight_smile:

[]'s

C

Tentei algo bem simplão aqui... Pra exibir o padrão, 4 respostas... Mas com certeza estou esquecendo algo, pois nada é exibido na saída...

import java.io.IOException;
import java.util.Scanner;

public class DoThePing {

	public static void main(String args[]) throws IOException{
		String ip = "www.uol.com.br";
		String resposta = "";
		Scanner scanner = new Scanner(Runtime.getRuntime().exec("cmd /c ping " + ip).getInputStream());
		resposta = scanner.nextLine();
		System.out.println("Disparando contra: " + ip);
		System.out.println(resposta);
	}
}
C

Arrumei...

import java.io.IOException;
import java.util.Scanner;

public class DoThePing {

	public static void main(String args[]) throws IOException{
		String ip = "www.iwts.com.br";
		String resposta="";
		Scanner scanner = new Scanner(Runtime.getRuntime().exec("cmd /c ping " + ip).getInputStream());
		
		while(scanner.hasNextLine()){
			resposta += scanner.nextLine() + "\n";
		}	
		System.out.print(resposta);
	}
}

Mas a saída está saindo com muito espaço entre um teste e outro... Ex:

Disparando contra www.iwts.com.br [189.14.105.90] com 32 bytes de dados:

Resposta de 189.14.105.90: bytes=32 tempo=28ms TTL=251

Resposta de 189.14.105.90: bytes=32 tempo=25ms TTL=251

Resposta de 189.14.105.90: bytes=32 tempo=27ms TTL=251

Resposta de 189.14.105.90: bytes=32 tempo=24ms TTL=251

Estat¡sticas do Ping para 189.14.105.90:

Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda),

Aproximar um n£mero redondo de vezes em milissegundos:

M¡nimo = 24ms, M ximo = 28ms, M?dia = 26ms

Sem falar na acentuação que está incorreta... Alguma ideia?

P

Sobre acentuação não…no prompt, aparece a acentuação?

Do espaço, dá uma procurada nas quebras de linha do Java e de repente vc acha algo q te ajude :smiley:

C

A acentuação eu corrigi na mão mesmo, substituindo os caracteres...

Agora a quebra de linha tá embaçado... Exemplo:

import java.io.IOException;
import java.util.Scanner;

public class DoThePing {

	public static void main(String[] args) throws IOException{
		String ip = "www.uol.com.br";
		String resposta="";
			
		Scanner scanner = new Scanner(Runtime.getRuntime().exec("cmd /c ping " + ip).getInputStream());
		while(scanner.hasNextLine()){
			resposta = scanner.nextLine();
			String respostaNew = resposta.replaceAll("¡", "í");
			respostaNew = respostaNew.replaceAll(" ", "á");
			respostaNew = respostaNew.replaceAll("?", "é");
			respostaNew = respostaNew.replaceAll("£", "ú");
			System.out.print(respostaNew);
		}
	}
}

Dessa forma, ele sai tudo junto sem qubra de linha alguma, sai tudo na mesma linha...

E se eu usar um Println ao invés de somente print, ele sai com aquele monte de quebra de linha, ele não adiciona somente uma...

C

Galera, valeu pela ajuda, já resolvi!

Fiz o mesmo esquema de replace para adicionar as quebras de linha:

import java.io.IOException;
import java.util.Scanner;

public class DoThePing {

	public static void main(String[] args) throws IOException{
		String ip = "www.uol.com.br";
		String resposta="";
		String respostaNew="";
			
		Scanner scanner = new Scanner(Runtime.getRuntime().exec("cmd /c ping " + ip).getInputStream());
		while(scanner.hasNextLine()){
			resposta = scanner.nextLine();
			respostaNew = resposta.replaceAll("¡", "í");
			respostaNew = respostaNew.replaceAll(" ", "á");
			respostaNew = respostaNew.replaceAll("?", "é");
			respostaNew = respostaNew.replaceAll("£", "ú");
			respostaNew = respostaNew.replaceAll("bytes de dados:", "bytes de dados:\n");
			respostaNew = respostaNew.replaceAll("Resposta", "\nResposta");
			respostaNew = respostaNew.replaceAll("Esgotado o tempo limite do pedido.", "\nO equipamento não responde.");
			respostaNew = respostaNew.replaceAll("Pacotes:", "\nPacotes");
			respostaNew = respostaNew.replaceAll("Estatísticas", "\n\nEstatísticas");
			respostaNew = respostaNew.replaceAll("    ", "");
			respostaNew = respostaNew.replaceAll("Aproximar um", "\n\nAproximar um");
			respostaNew = respostaNew.replaceAll("Mínimo", "\nMínimo");
			System.out.print(respostaNew);
		}
	}
}

Agora minha saída fica:

Disparando contra www.uol.com.br [200.221.2.45] com 32 bytes de dados:

Resposta de 200.221.2.45: bytes=32 tempo=27ms TTL=251
Resposta de 200.221.2.45: bytes=32 tempo=25ms TTL=251
Resposta de 200.221.2.45: bytes=32 tempo=26ms TTL=251
Resposta de 200.221.2.45: bytes=32 tempo=27ms TTL=251

Estatísticas do Ping para 200.221.2.45:
Pacotes Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda),

Aproximar um número redondo de vezes em milissegundos:
Mínimo = 25ms, Máximo = 27ms, Média = 26ms

Agora é só usar alguns substring() junto com isDigit() para separar os números de testes efetuados, média, etc...

Muito obrigado pela ajuda novamente!

C

Galera… Desculpa reviver o tópico… Mas encontrei outra dificuldade… Ainda estou iniciando em JAVA e tenho muitas dúvidas…

No meu comando de ping, eu coloquei o parametro “-t”, para ele pingar infinitamente… Porém eu quero que, através de um botão, ele pare o ping…

Pelo DOS, basta pressionar Control-C que ele interrompe o ping e mostra as estatisticas… Mas eu tenho como fazer isso em java?

Ou seja, ao pressionar um botão, ele enviar o comando “Control-C” pra janela do DOS que está pingando?

Criado 9 de novembro de 2008
Ultima resposta 13 de nov. de 2008
Respostas 7
Participantes 2