sinian 发表于 2013-1-15 03:12:34

jdk1.5获取子网广播地址

用jdk1.6可以很容易的获取子网广播地址,但是1.5并没有实现相应的方法。我写了如下代码,已经在window xp和linux redhat中测试通过。
第一个类:实现子网广播地址
import java.io.BufferedReader;import java.io.DataInputStream;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Enumeration;import java.util.Vector;public class SubnetAddress{    private static Process p;            public void SubnetAddress(){            }            /**   * 获取本机IP   * @return   */    private String getIpAddressFromLinux(){      Enumeration netInterfaces;      String result=null;      try {            netInterfaces = NetworkInterface.getNetworkInterfaces();                InetAddress ip = null;            while(netInterfaces.hasMoreElements()){                NetworkInterface ni=(NetworkInterface)netInterfaces.nextElement();                ip=(InetAddress) ni.getInetAddresses().nextElement();                if( !ip.isLoopbackAddress()&& ip.getHostAddress().indexOf(":")==-1)                {                  result=ip.getHostAddress();                  break;                }                else                                     ip=null;               }      } catch (SocketException e) {                        e.printStackTrace();      }      return result;    }      /**   * 获取本机IP   * @return   */    private String getIpAddress(){      String result=null;      InetAddress inet;      try {            inet = InetAddress.getLocalHost();            result = inet.getHostAddress();      } catch (UnknownHostException e) {            e.printStackTrace();      }                return result;    }      /**   * 使用ipconfig/all命令   * 获取windows系统上的子网掩码   * @return   */    private String getSubnetAddressForWindow(){      String cmd = "cmd.exe /c ipconfig/all"; //window下获取子网掩码的命令      String find ="Subnet Mask";//子网掩码的提示                        Vector ipConfigs;          ipConfigs = execute(cmd);            Object[] ipConfigArray=ipConfigs.toArray();      String result = null;      for(int i=0;i<ipConfigArray.length;i++){            String ipConfig = ipConfigArray.toString();            if(!ipConfig.equalsIgnoreCase("") && ipConfig.indexOf(find)!=-1){                String[] subnet = ipConfig.split(":");                result = subnet.substring(1);                break;            }      }      return result;    }         /**   * 使用ifconfig命令   * 获取linux系统上的子网掩码   * @return   */    private String getSubnetAddressForLinux(){                        String cmd = "ifconfig"; //linux下获取子网掩码的命令      String find = "Mask";//子网掩码的提示                  Vector ipConfigs;          ipConfigs = execute(cmd);            Object[] ipConfigArray=ipConfigs.toArray();      String result = null;      for(int i=0;i<ipConfigArray.length;i++){            String ipConfig = ipConfigArray.toString();            if(!ipConfig.equalsIgnoreCase("") && ipConfig.indexOf(find)!=-1){                              String[] subnet1 = ipConfig.split(find);                String[] subnet = subnet1.split(":");                result = subnet;                              break;            }      }      return result;    }         /**   * 执行命令   * @param shellCommand   * @return   */    private Vector execute(String shellCommand){                     try{            Start(shellCommand);                         Vector vResult=new Vector();                         DataInputStream in=new DataInputStream(p.getInputStream());                         BufferedReader reader=new BufferedReader(new InputStreamReader(in));                         String line;            do{                line=reader.readLine();                  if(line==null){                      break;                  }                  else{                      vResult.addElement(line);                  }            }while(true);            reader.close();            return   vResult;            }catch(Exception e){                           return null;            }      }         private void Start(String shellCommand){               try{            if(p!=null){                  p.destroy();                  p=null;                }            Runtime sys=Runtime.getRuntime();            p=sys.exec(shellCommand);          }catch(Exception   e){            e.printStackTrace();          }      }            /**   * 根据本机IP和子网掩码,计算子网广播地址   * @param ip 本机ip   * @param subnet 本机子网掩码   * @return   */   public String calculate() {         String os = System.getProperty("os.name").substring(0, 3);         String subnet;            if(os.equalsIgnoreCase("win")){                subnet = getSubnetAddressForWindow();            }            else{                subnet = getSubnetAddressForLinux();            }                     String ip = getIpAddress();                        String[] ips = ip.split("\\.");          String[] subnets = subnet.split("\\.");         StringBuffer sb = new StringBuffer();         for(int i = 0; i < ips.length; i++) {             ips = String.valueOf((~Integer.parseInt(subnets))|(Integer.parseInt(ips)));             sb.append(turnToStr(Integer.parseInt(ips)));             if(i != (ips.length-1))               sb.append(".");         }                                             return turnToIp(sb.toString());    }   /**      * 把带符号整形转换为二进制      * @param num      * @return      */    private String turnToStr(int num) {      String str = "";      str = Integer.toBinaryString(num);                  int len = 8 - str.length();      // 如果二进制数据少于8位,在前面补零.      for (int i = 0; i < len; i++) {            str = "0" + str;      }      //如果num为负数,转为二进制的结果有32位,如1111 1111 1111 1111 1111 1111 1101 1110      //则只取最后的8位.      if (len < 0)            str = str.substring(24, 32);      return str;    }            /**   * 把二进制形式的ip,转换为十进制形式的ip   * @param str   * @return   */    private String turnToIp(String str){      String[] ips = str.split("\\.");      StringBuffer sb = new StringBuffer();      for (int i = 0; i < ips.length; i++) {            sb.append(turnToInt(ips));            sb.append(".");      }                  sb.deleteCharAt(sb.length() - 1);      return sb.toString();    }    /**   * 把二进制转换为十进制   * @param str   * @return   */    private int turnToInt(String str){      int total = 0;      int top = str.length();      for (int i = 0; i < str.length(); i++) {            String h = String.valueOf(str.charAt(i));            top--;            total += ((int) Math.pow(2, top)) * (Integer.parseInt(h));      }      return total;    }}

第二个类:调用上个类中的方法
import java.net.SocketException;import java.net.UnknownHostException;public class test{    public static void main(String[] args) throws SocketException, UnknownHostException{      System.out.println(System.getProperty("os.name"));      SubnetAddress sa = new SubnetAddress();      String s = sa.calculate();      System.out.println(s);    }}
页: [1]
查看完整版本: jdk1.5获取子网广播地址