강좌 & 팁
글 수 2,412
2013.12.28 15:08:44 (*.52.177.249)
43965
저번 시간에는 윈도우 커멘드창에서 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; } }
[실행 결과]
좀 더 멋지게 또는 쉽게 만들수 있는 분은 소스좀 공유해주세요. ^^;;
감사합니다.