저번 시간에는 윈도우 커멘드창에서 netsh명령어를 사용해 네트워크 인터페이스 이름과

그 이름으로 다시 IP정보를 취득 하는 방법에 대해 알아 보았습니다.


왜 굳이 netsh명령으로 IP정보를 가져와야 하나??


그건 필요한 정보만 보고 싶어서죠...^^;


ipconfig로 보면 내 컴퓨터에 달려있는 네트워크 정보를 다 보여줘서 편하긴 한데....

프로그램으로 IP정보를 알고 싶을 경우에는 불필한 정보가 많이있어 그걸 다 제거하기가 어렵겠죠?


삽질을 많이 하면 필요한 정보만을 빼올수는 있겠지만.....

삽질을 덜 하는게 목적 이므로 netsh명령을 사용하면 삽질을 덜 할 수 있기 때문에 netsh명령을 사용합니다.

(단지, 제 개인적인 생각임을 유념 하시기 바랍니다. ^^;)


이번 시간은 Java프로그램을 사용해서 IP를취득해 오는 방법에 대해 알아보도록 하였습니다.


프로그램 순서는 아래와 같습니다.

1. 네트워크 인터페이스 이름 취득

  - 취득 방법은 ProcessBuilder클래스를 사용해서 커멘드 명령어를 실행해 결과를 얻어 필요한 부분만 취득

2. 취득한 네트워크 인터페이스 이름으로 IP취득

  - 취득 방법은1번 내용과 동일.

3. 취득한 IP출력


순서는 어렵지 않습니다. 아주 간단하죠!!


프로그램 소스 입니다.

[소스]

import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
 
/**
 * @author falbb
 *
 */
public class LocalIpGetProcessBuilder {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
 
		String[] cmd = null;
 
		// 실행 커맨드 명령어 설정
		cmd = new String[] {"cmd", "/c", "netsh int show interface" };
 
		// 네트워크 인터페이스 이름 취득
		List<String> interList = getEnableInterface(cmd);
 
		List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
		for (int i = 0; i < interList.size(); i++) {
 
			// 인터페이스 이름의 IP, 게이트웨이를 취득
			cmd = new String[] {"cmd", "/c", "netsh int ip show addresses "+"\""+interList.get(i)+"\"" };
 
			// 네트워크 정보 리스트
			result.add(getInterfaceInfo(cmd, interList.get(i)));
 
		}
 
		System.out.println(result);
 
 
	}
 
	/**
	 * 설명 : 네트워크 인터페이스 이름 취득
	 * @param cmd
	 * @return 인터페이스 이름 리스트
	 */
	private static List<String> getEnableInterface(String[] cmd) {
 
		Process process = null;
		List<String> interfalceList = new ArrayList<String>();
		try {
 
			// 프로세스빌더 실행
			process = new ProcessBuilder(cmd).start();
 
			// SequenceInputStream은 여러개의 스트림을 하나의 스트림으로 연결해줌.
			SequenceInputStream seqIn = new SequenceInputStream(
					process.getInputStream(), process.getErrorStream());
 
			// 스캐너클래스를 사용해 InputStream을 스캔함
			Scanner s = new Scanner(seqIn);
			int line = 0;
			while (s.hasNextLine() == true) {
				line++;
				String str_line = s.nextLine();
//				System.out.println(str_line);
 
				// 내용이 3번째 줄부터 있기때문에 줄수가 3이상일때만 처리함.
				if (line > 3) {
 
					// 표준출력으로 출력
					String[] info = str_line.split("            ");
					if (info.length < 4) {
						continue;
					}
					String mngState = info[0].trim();	// 관리상태
					String netUsed = info[1].trim(); 	// 상태
					String kind = info[2].trim(); 		// 종류
					String interName = info[3].trim();	// 인터페이스 이름
 
					// 인터페이스 이름 설정
					interfalceList.add(interName);
				}
			}
			// 스트림 닫기
			seqIn.close();
			// 프로세스 닫기
			process.destroy();
 
		} catch (IOException e) {
			e.printStackTrace();
		}
 
		return interfalceList;
	}
 
	/**
	 * 설명 : 인터페이스 이름으로 IP,GW취득
	 * @param cmd
	 * @param name
	 * @return map{gw, name, netmask, ip}
	 */
	private static Map<String, Object> getInterfaceInfo(String[] cmd, String name) {
 
		Process process = null;
 
		Map<String, Object> map = null;
		try {
 
			// 프로세스빌더 실행
			process = new ProcessBuilder(cmd).start();
 
			// SequenceInputStream은 여러개의 스트림을 하나의 스트림으로 연결해줌.
			SequenceInputStream seqIn = new SequenceInputStream(
					process.getInputStream(), process.getErrorStream());
 
			// 스캐너클래스를 사용해 InputStream을 스캔함
			Scanner s = new Scanner(seqIn);
 
 
			while (s.hasNextLine() == true) {
				String str_line = s.nextLine();
				String[] attrib = str_line.split(":");
 
				// 2줄은 타이틀이므로 무시
				if (attrib.length < 2) {
					continue;
				}
 
				if (attrib[0].trim().indexOf("DHCP") > -1) {
					map = new HashMap<String, Object>();
					map.put("name", name);
				} else if (attrib[0].trim().indexOf("IP") > -1) {
					map.put("ip", attrib[1].trim());
				} else if (attrib[0].trim().indexOf("서브넷 접두사") > -1) {
					map.put("netmask", attrib[1].trim());
				} else if (attrib[0].trim().indexOf("기본 게이트웨이") > -1) {
					map.put("gw", attrib[1].trim());
				} else if (attrib[0].trim().indexOf("게이트웨이 메트릭") > -1) {
 
				} else if (attrib[0].trim().indexOf("인터페이스 메트릭") > -1) {
 
				}
			}
 
			// 스트림 닫기
			seqIn.close();
			// 프로세스 닫기
			process.destroy();
 
		} catch (IOException e) {
			e.printStackTrace();
		}
 
		return map;
	}
}


[실행 결과]

getIp.PNG


좀 더 멋지게 또는 쉽게 만들수 있는 분은 소스좀 공유해주세요. ^^;;


감사합니다.