Informações de rede

Olá, sou novo no forum e estou querendo desenvolver uma aplicação java que liste os ips e o nome dos computadores da rede, gostaria da ajuda de vocês para me ajudar a obter essas informações. Tenho experiência em outras linguagens e sou novo no java e estou querendo desenvolver essa aplicação ate como uma forma de aprendizado.

Obrigado

Cara, acho o que você quer, não é tão simples de fazer, você teria que percorrer todos os possiveis ip’s e testar se estão ativos. Isso demanda um tempo, mas você pode usar threads, e também pode utilizar uma faixa de ip, como por exemplo ip’s que estão entre 192.168.0.0 e 192.168.0.255. Dê uma lida na documentacao da classe InetAddress, ela possui alguns metodos que podem ajudar.

Usando a classe InetAddress, podemos verificar quais hosts estão ativos (e que respondem a pings) em determinada rede:

import java.io.IOException;
import java.net.InetAddress;

public class VerificaHosts {

	public static void main(String[] args) throws IOException {
		for (int i = 1; i < 255; i++) {
			InetAddress host = InetAddress.getByName("192.168.1." + i);
			if (host.isReachable(200)) {
				System.out.println(host);
			}
		}
	}
	
}

Com isso pingamos todos os hosts da rede 192.168.1.0 e sabemos se estão ativos ou não.

Quanto ao nome dos hosts, parece um problema maior. Esses nomes seriam resolvidos como? Via DNS?

Seguindo a sugestão do marcobiscaro2112 fiz um exemplo meio na gambiarra (acredito ter uma forma mais inteligente para fazer isso) mais como sou novo em java creio que vale a intenção. Pesquisei em alguns foruns e percebi que muitas pessoas querem fazer a mesma coisa. Sugestões, dicas são bem vindas afinal estou iniciando minha jornada em java.

import java.io.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.util.regex.*;

public class IpLanTest {
	public static void main(String[] args) throws IOException {
		
		Process cmd = Runtime.getRuntime().exec("net view");

		BufferedReader in = new BufferedReader(new InputStreamReader(cmd.getInputStream()));

		List lista = new ArrayList();
		List listaIp = new ArrayList();

		while (true) {
			String line = in.readLine();
			
			if (line == null) {
				break;
			}

			Pattern p = Pattern.compile("^\\.*$");
			Matcher m = p.matcher(line);

			if (m.matches()) {

				String nameComputer = m.group(0).replace("\", "").replace(" ",	"");

				lista.add(nameComputer);
				
				try{
					InetAddress address = InetAddress.getByName(nameComputer);
					listaIp.add((String) address.getHostAddress());
				}catch (UnknownHostException uhe) {
					
				}
				
			}
		}
		in.close();

		String[] name = (String[]) lista.toArray(new String[0]);
		String[] nameIP = (String[]) listaIp.toArray(new String[0]);

		System.out.print("COMPUTADOR \t\tIP\n");
		for (int i = 0; i < nameIP.length; i++) {
			
			System.out.print(name[i] + " \t\t" + nameIP[i] + "\n");

		}

	}

}

De fato foi meio gambiarra. Tanto que tira uma das grandes características do Java: multiplataforma. Não funciona no Linux. Vou pesquisar mais sobre o assunto e dou uma resposta assim que possível.