Liny_@NotePad

沉迷ACG中

获取本机IP\MAC

YOYO posted @ 2009年4月14日 20:52 in 【Java SE】 with tags 工厂模式 ip mac , 2149 阅读

正好要做一个读取本机IP和MAC地址的练习,发现windows下和linux的不一样,于是干脆一起来做工厂模式练习~不过返回都是String - -。

 首先是IPReader接口和MACReader接口,表示可以读取IP和MAC的行为:

  1. package net.reader;
  2.  
  3. public interface IPReader {
  4.        
  5.         public String getIP();
  6.  
  7. }
  8.  
  1. package net.reader;
  2.  
  3. public interface MACReader {
  4.        
  5.         public String getMAC();
  6.  
  7. }

Windows下的实现类

  1. package net.reader;
  2.  
  3. import java.net.InetAddress;
  4. import java.net.UnknownHostException;
  5.  
  6.  
  7. public class WindowsIPReader implements IPReader {
  8.  
  9.         public String getIP() {
  10.                 String ip;
  11.                 try {
  12.                         ip = InetAddress.getLocalHost().getHostAddress();
  13.                 } catch (UnknownHostException e) {
  14.                         ip = "Can not read ip!";
  15.                         e.printStackTrace();
  16.                 }
  17.                 return ip;
  18.         }
  19.  
  20. }

 

  1. package net.reader;
  2.  
  3. import java.io.*;
  4.  
  5.  
  6. public class WindowsMACReader implements MACReader {
  7.  
  8.         public String getMAC() {
  9.                 String mac = null;
  10.                 try {
  11.                         Process p = Runtime.getRuntime().exec("ipconfig /all");
  12.                         BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
  13.                         String s, str = "";
  14.                         while((s=br.readLine())!=null){
  15.                                 if(s.contains("Physical Address")){
  16.                                         mac = s.substring(44);
  17.                                         break;
  18.                                 }
  19.                         }
  20.                 } catch (IOException e) {
  21.                         mac = "Cannot read MAC Address!";
  22.                         e.printStackTrace();
  23.                 }
  24.                 return mac;
  25.         }
  26.        
  27. }

 

Linux下的实现类

  1. package net.reader;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6.  
  7. public class LinuxIPReader implements IPReader {
  8.  
  9.         public String getIP() {
  10.                 String ip = null;
  11.                 try {
  12.                         Process p = Runtime.getRuntime().exec("ifconfig");
  13.                         BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
  14.                         String s, str = "";
  15.                         while((s=br.readLine())!=null){
  16.                                 if(s.contains("inet addr")){
  17.                                         ip = s.substring(20,35);
  18.                                         break;
  19.                                 }
  20.                         }
  21.                 } catch (IOException e) {
  22.                         ip = "Cannot read IP Address!";
  23.                         e.printStackTrace();
  24.                 }
  25.                 return ip;
  26.         }
  27.  
  28. }
  1. package net.reader;
  2.  
  3. import java.io.*;
  4.  
  5.  
  6. public class LinuxMACReader implements MACReader {
  7.  
  8.         public String getMAC() {
  9.                 String mac = null;
  10.                 try {
  11.                         Process p = Runtime.getRuntime().exec("ifconfig");
  12.                         BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
  13.                         String s, str = "";
  14.                         while((s=br.readLine())!=null){
  15.                                 if(s.contains("HWaddr")){
  16.                                         mac = s.substring(35);
  17.                                         break;
  18.                                 }
  19.                         }
  20.                 } catch (IOException e) {
  21.                         mac = "Cannot read MAC Address!";
  22.                         e.printStackTrace();
  23.                 }
  24.                 return mac;
  25.         }
  26.        
  27. }

然后是抽象工厂

  1. package net.factory;
  2.  
  3. public abstract class NetFactory {
  4.        
  5.         public abstract String getIP();
  6.        
  7.         public abstract String getMAC();
  8.  
  9. }

 

Windows实现类

  1. package net.factory;
  2.  
  3. import net.reader.WindowsIPReader;
  4. import net.reader.WindowsMACReader;
  5.  
  6. public class WindowsFactory extends NetFactory {
  7.  
  8.         @Override
  9.         public String getIP() {
  10.                 return new WindowsIPReader().getIP();
  11.         }
  12.  
  13.         @Override
  14.         public String getMAC() {
  15.                 return new WindowsMACReader().getMAC();
  16.         }
  17.  
  18. }

 

Linux实现类

  1. package net.factory;
  2.  
  3. import net.reader.LinuxIPReader;
  4. import net.reader.LinuxMACReader;
  5.  
  6. public class LinuxFactory extends NetFactory {
  7.  
  8.         @Override
  9.         public String getIP() {
  10.                 return new LinuxIPReader().getIP();
  11.         }
  12.  
  13.         @Override
  14.         public String getMAC() {
  15.                 return new LinuxMACReader().getMAC();
  16.         }
  17.  
  18. }

 

最后是一个创建工厂的工厂 = =

  1. package net.factory;
  2.  
  3.  
  4. public class SystemFactory {
  5.        
  6.         public static NetFactory getInstance(){
  7.                 String os = System.getProperty("os.name");
  8.                 if(os==null){
  9.                         return null;
  10.                 }
  11.                 if(os.startsWith("Windows")){
  12.                         return new WindowsFactory();
  13.                 }
  14.                 if(os.startsWith("Linux")){
  15.                         return new LinuxFactory();
  16.                 }
  17.                 return null;
  18.         }
  19.  
  20. }

输出部分:

  1. package net;
  2.  
  3. import net.factory.*;
  4.  
  5. public class NetProgramTest {
  6.        
  7.         public static void main(String[] args) {
  8.                 try{
  9.                         NetFactory factory = SystemFactory.getInstance();
  10.                         System.out.println("IP: " + factory.getIP());
  11.                         System.out.println("MAC Address: " + factory.getMAC());
  12.                 }catch(Exception e){
  13.                         System.out.println("Cannot read System Info!");
  14.                 }
  15.         }
  16.  
  17. }

在winXP和redhat9.0下测试可行~


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter