/*
* @author 卢伟
* @version 1.0 2008-03-06
*
*/
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
public class IPMask {
public static void main(String args[]) {
IPMaskFrame frame = new IPMaskFrame();
frame.init();
}
}
/**
* 主界面
*/
class IPMaskFrame extends JFrame implements ActionListener, KeyListener {
private static final long serialVersionUID = 1L;
//创建窗口对象
private JLabel addrLabel = new JLabel("IP地址:");
private JTextField addrField = new JTextField(9);
private JLabel maskLabel = new JLabel("子网掩码:");
private JTextField maskField = new JTextField(9);
private JPanel outputPanel = new JPanel();
private JTextArea outputArea = new JTextArea(7, 31);
private JButton calculateButton = new JButton("计算");
private JButton copyButton = new JButton("复制");
private JButton resetButton = new JButton("重置");
private JButton helpButton = new JButton("帮助");
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//关于对话框
private JLabel about = new JLabel("<html>      子网掩码计算器ver1.2.5 (2008-03-9)<br><br>该工具采用的计算公式是:<br>    网络地址 = IP地址 & 子网掩码<br>    广播地址 = ~广播地址+256 | IP地址<br>    可用主机数 = pow(2, 主机位数)-2<br>如果口算,可用如下快速计算公式:<br>     A = 256 -异常掩码<br>     B = 异常掩码对应的IP<br>    网络地址 = A*n(取最接近于B但小于B的值)<br>    广播地址 = 网络地址+A-1<br><br>     作者:地图<br>     邮件:godmap@sohu.com</html>");
private JLabel url = new JLabel(("<html>     博客:<a href=\"http://hi.baidu.com/godmap\">http://hi.baidu.com/godmap</a><br></html>"));
private JPanel aboutPanel = new JPanel();
private String os = System.getProperty ("os.name");
//初始化窗口
public void init() {
//设置窗口组件基本属性
this.setTitle("子网掩码计算器V1.2.5");
addrField.setToolTipText("格式:172.168.1.2 ……");
addrField.setActionCommand("addr");
addrField.addActionListener(this);
addrField.addKeyListener(this);
maskField.setToolTipText("格式:1~31或255.255.255.0 ……");
maskField.setActionCommand("mask");
maskField.addActionListener(this);
maskField.addKeyListener(this);
calculateButton.setToolTipText("计算结果。");
calculateButton.setActionCommand("calculate");
calculateButton.addActionListener(this);
copyButton.setToolTipText("将计算结果复制到系统剪贴板。");
copyButton.setActionCommand("copy");
copyButton.addActionListener(this);
resetButton.setToolTipText("将输入框清零。");
resetButton.setActionCommand("reset");
resetButton.addActionListener(this);
helpButton.setToolTipText("更多帮助。");
helpButton.setActionCommand("help");
helpButton.addActionListener(this);
outputArea.setToolTipText("Ctrl+A/Ctrl+C复制计算结果。");
outputArea.setEditable(false);
outputPanel.setBorder(new TitledBorder("计算结果"));
outputPanel.add(outputArea);
JScrollPane scrollBar = new JScrollPane(outputArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
outputPanel.add(scrollBar);
//设置关于窗口属性
url.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
url.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
if (os.startsWith ("Windows")) {
try {
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler http://hi.baidu.com/godmap");
} catch (Exception urlException) {
System.out.println("启动浏览器错误:".concat(urlException.toString().concat("\n请手动启动浏览器访问:http://hi.baidu.com/godmap")));
}
}
else
try {
Runtime.getRuntime().exec("mozila http://hi.baidu.com/godmap");
} catch (Exception urlException) {
System.out.println("启动浏览器错误:".concat(urlException.toString().concat("\n请手动启动浏览器访问:http://hi.baidu.com/godmap")));
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
GroupLayout aboutLayout = new GroupLayout(aboutPanel);
aboutLayout.setHorizontalGroup(aboutLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(about)
.addComponent(url));
aboutLayout.setVerticalGroup(aboutLayout.createSequentialGroup()
.addComponent(about)
.addComponent(url));
aboutPanel.setLayout(aboutLayout);
aboutPanel.add(about);
aboutPanel.add(url);
//添加布局管理器
GroupLayout groupLayout = new GroupLayout(getContentPane());
groupLayout.setAutoCreateContainerGaps(true);
groupLayout.setAutoCreateGaps(true);
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addGroup(groupLayout.createParallelGroup()
.addGroup(groupLayout.createSequentialGroup()
.addComponent(addrLabel)
.addComponent(addrField)
.addComponent(maskLabel)
.addComponent(maskField))
.addComponent(outputPanel))
.addGroup(groupLayout.createSequentialGroup()
.addComponent(calculateButton)
.addComponent(copyButton)
.addComponent(resetButton)
.addComponent(helpButton))
);
groupLayout.setVerticalGroup(
groupLayout.createSequentialGroup()
.addGroup(groupLayout.createParallelGroup()
.addComponent(addrLabel)
.addComponent(addrField)
.addComponent(maskLabel)
.addComponent(maskField))
.addComponent(outputPanel)
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(calculateButton)
.addComponent(copyButton)
.addComponent(resetButton)
.addComponent(helpButton))
);
getContentPane().setLayout(groupLayout);
//输出窗口
pack();
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation((screenSize.width-getWidth())/2, (screenSize.height-getHeight())/2);
setVisible(true);
}
//事件监听
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("calculate")) {
outputArea.setText(this.getIPMask(deSpace(addrField), deSpace(maskField)));
outputArea.setCaretPosition(0);
}
else if(e.getActionCommand().equals("copy")) {
this.outputArea.selectAll();
this.outputArea.copy();
}
else if(e.getActionCommand().equals("reset")) {
this.addrField.setText("");
this.maskField.setText("");
}
else if(e.getActionCommand().equals("help")) {
JOptionPane.showMessageDialog(null, aboutPanel, "关于", JOptionPane.INFORMATION_MESSAGE );
}
else ;
}
//键盘监听
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==10) {
this.calculateButton.doClick();
}
}
public void keyTyped(KeyEvent e) {
}
//主方法
public String getIPMask(String ipAddr, String maskAddr) {
String outputMaskInfo = "非法IP或子网掩码地址。";
//非法IP或子网掩码地址,不进行计算。
if(!isValidIP(ipAddr) || !isValidMask(maskAddr))
return outputMaskInfo;
//合法IP、子网掩码,开始计算。
if(maskAddr.indexOf(".") == -1)
maskAddr = getMask(Byte.parseByte(maskAddr));
String[] ipSplit = {"0","0","0","0"};
String[] maskSplit = {"0","0","0","0"};
ipSplit = ipAddr.split("\\.");
maskSplit = maskAddr.split("\\.");
String ip = "";
String mask = "";
String netIP = "";
String broadcastIP = "";
String startIP = "";
String endIP = "";
String binaryMask = "";
String addrType = "";
//String hostIP = "";
int hostNum = 0;
//int subNetNum = 0;
int subNetMaxNum = 0;
for(int i = 0; i < 4; i++) {
int ipTemp = Integer.parseInt(ipSplit[i]);
int maskTemp = Integer.parseInt(maskSplit[i]);
//地址类型
if(i == 0) {
if(ipTemp == 127)
addrType = "回环地址:";
else if(ipTemp < 127)
addrType = "A类地址:";
else if(ipTemp < 192)
addrType = "B类地址:";
else if(ipTemp < 224)
addrType = "C类地址:";
else if(ipTemp < 240)
addrType = "D类(组播)地址:";
else if(ipTemp < 255)
addrType = "E类(保留)地址:";
}
//用户输入的IP
ip = ip.concat(Integer.toString(ipTemp)).concat(".");
//用户输入的子网掩码
mask = mask.concat(Integer.toString(maskTemp)).concat(".");
//网络地址
netIP = netIP.concat(Integer.toString(ipTemp & maskTemp)).concat(".");
//广播地址
broadcastIP = broadcastIP.concat(Integer.toString(~maskTemp+256 | ipTemp)).concat(".");
//主机地址
//hostIP = hostIP.concat(Integer.toString(~maskTemp & ipTemp)).concat(".");
//可分配主机地址
if(i < 3) {
startIP = startIP.concat(Integer.toString(ipTemp & maskTemp)).concat(".");
endIP = endIP.concat(Integer.toString(~maskTemp+256 | ipTemp)).concat(".");
}
else if(i == 3) {
if(maskTemp != 254) {
startIP = startIP.concat(Integer.toString((ipTemp & maskTemp) + 1)).concat(".");
endIP = endIP.concat(Integer.toString((~maskTemp+256 | ipTemp) - 1)).concat(".");
}
else {
startIP = "无.";
endIP = "无.";
}
}
//生成连续的二进制子网掩码,以计算可用主机数
binaryMask = binaryMask.concat(Integer.toBinaryString(maskTemp));
}
//可用主机数
hostNum = (int)Math.pow(2, 32 - this.getMaskBit(binaryMask)) - 2;
//可划分子网数
subNetMaxNum = (int)(32-getMaskBit(binaryMask)-2 > 0 ? Math.pow(2, 32-getMaskBit(binaryMask)-2):0);
//计算子网
outputMaskInfo = addrType.concat(ip.substring(0, ip.length() - 1)).concat("/").concat(mask.substring(0, mask.length() - 1))
.concat("的\n网络地址是:").concat(netIP.substring(0, netIP.length() - 1))
.concat("\n广播地址是:".concat(broadcastIP.substring(0, broadcastIP.length() - 1))
.concat("\n可分配主机地址包括:").concat(startIP.substring(0, startIP.length() - 1)).concat("~").concat(endIP.substring(0, endIP.length() - 1))
.concat("\n可用主机数共:").concat(Integer.toString(hostNum)).concat("台")
.concat("\n最多可划分:") .concat(Integer.toString(subNetMaxNum).concat("个子网\n")));
//.concat(this.getIPMask(false)));
return outputMaskInfo;
}
//计算子网分配方案
public String getSubNet() {
String subNetInfo = "子网分配方案如下:\n";
for(int i=0; i<this.getIPMask("","").indexOf("a"); i++) {
}
return subNetInfo;
}
//转换十进制掩码为IP地址格式掩码
public String getMask(byte maskBit) {
if(maskBit == 1)
return "128.0.0.0";
else if(maskBit == 2)
return "192.0.0.0";
else if(maskBit == 3)
return "224.0.0.0";
else if(maskBit == 4)
return "240.0.0.0";
else if(maskBit == 5)
return "248.0.0.0";
else if(maskBit == 6)
return "252.0.0.0";
else if(maskBit == 7)
return "254.0.0.0";
else if(maskBit ==
return "255.0.0.0";
else if(maskBit ==9)
return "255.128.0.0";
else if(maskBit == 10)
return "255.192.0.0";
else if(maskBit == 11)
return "255.224.0.0";
else if(maskBit == 12)
return "255.240.0.0";
else if(maskBit == 13)
return "255.248.0.0";
else if(maskBit == 14)
return "255.252.0.0";
else if(maskBit == 15)
return "255.254.0.0";
else if(maskBit == 16)
return "255.255.0.0";
else if(maskBit == 17)
return "255.255.128.0";
else if(maskBit == 18)
return "255.255.192.0";
else if(maskBit == 19)
return "255.255.224.0";
else if(maskBit == 20)
return "255.255.240.0";
else if(maskBit == 21)
return "255.255.248.0";
else if(maskBit == 22)
return "255.255.252.0";
else if(maskBit == 23)
return "255.255.254.0";
else if(maskBit == 24)
return "255.255.255.0";
else if(maskBit == 25)
return "255.255.255.128";
else if(maskBit == 26)
return "255.255.255.192";
else if(maskBit == 27)
return "255.255.255.224";
else if(maskBit == 28)
return "255.255.255.240";
else if(maskBit == 29)
return "255.255.255.248";
else if(maskBit == 30)
return "255.255.255.252";
else if(maskBit == 31)
return "255.255.255.254";
else if(maskBit == 32)
return "255.255.255.255";
return "";
}
//判断IP是否合法
public boolean isValidIP(String ip) {
if(ip.indexOf(".") == -1)
return false;
String[] ipSplit = ip.split("\\.");
int ipNum = 0;
if (ipSplit.length != 4)
return false;
for (int i = 0; i < ipSplit.length; i++) {
try {
ipNum = Integer.parseInt(ipSplit[i]);
}catch(Exception e) {
return false;
}
if(ipNum < 0 || ipNum > 255)
return false;
if(i == 0)
if(ipNum == 0 || ipNum == 255)
return false;
}
return true;
}
//判断子网掩码是否合法
public boolean isValidMask(String mask) {
int maskNum = 0;
int maskBit = 0;
//十进制掩码
if(mask.indexOf(".") == -1) {
try {
maskBit = Byte.parseByte(mask);
}catch(Exception e) {
return false;
}
if(maskBit > 31 || maskBit < 1) {
return false;
}
return true;
}
//IP格式掩码
String[] maskSplit = mask.split("\\.");
String maskBinString = "";
if(maskSplit.length != 4)
return false;
//将大于128的4个掩码段连成2进制字符串
for(int i=0; i<maskSplit.length; i++) {
try {
maskNum = Integer.parseInt(maskSplit[i]);
}catch(Exception e) {
return false;
}
//首位为0,非法掩码
if(i == 0 && Integer.numberOfLeadingZeros(maskNum) == 32)
return false;
//非0或128~255之间,非法掩码
if(Integer.numberOfLeadingZeros(maskNum) != 24)
if(Integer.numberOfLeadingZeros(maskNum) != 32)
return false;
//将大于128的掩码段连接成完整的二进制字符串
maskBinString = maskBinString.concat(Integer.toBinaryString(maskNum));
}
//二进制掩码字符串,包含非连续1时,非法掩码
if(maskBinString.indexOf("0") < maskBinString.lastIndexOf("1"))
return false;
//剩下的就是合法掩码
return true;
}
//识别掩码位数
public int getMaskBit(String binaryMask) {
return binaryMask.lastIndexOf("1") + 1;
}
//过滤空格
public String deSpace(JTextField textField) {
String curStr = null;
String outStr = "";
for (int i = 0; i < textField.getText().length(); i++) {
curStr = textField.getText().substring(i, i + 1);
if (!curStr.equals(" ")) {
outStr += curStr;
}
}
return outStr;
}
}
* @author 卢伟
* @version 1.0 2008-03-06
*
*/
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
public class IPMask {
public static void main(String args[]) {
IPMaskFrame frame = new IPMaskFrame();
frame.init();
}
}
/**
* 主界面
*/
class IPMaskFrame extends JFrame implements ActionListener, KeyListener {
private static final long serialVersionUID = 1L;
//创建窗口对象
private JLabel addrLabel = new JLabel("IP地址:");
private JTextField addrField = new JTextField(9);
private JLabel maskLabel = new JLabel("子网掩码:");
private JTextField maskField = new JTextField(9);
private JPanel outputPanel = new JPanel();
private JTextArea outputArea = new JTextArea(7, 31);
private JButton calculateButton = new JButton("计算");
private JButton copyButton = new JButton("复制");
private JButton resetButton = new JButton("重置");
private JButton helpButton = new JButton("帮助");
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//关于对话框
private JLabel about = new JLabel("<html>      子网掩码计算器ver1.2.5 (2008-03-9)<br><br>该工具采用的计算公式是:<br>    网络地址 = IP地址 & 子网掩码<br>    广播地址 = ~广播地址+256 | IP地址<br>    可用主机数 = pow(2, 主机位数)-2<br>如果口算,可用如下快速计算公式:<br>     A = 256 -异常掩码<br>     B = 异常掩码对应的IP<br>    网络地址 = A*n(取最接近于B但小于B的值)<br>    广播地址 = 网络地址+A-1<br><br>     作者:地图<br>     邮件:godmap@sohu.com</html>");
private JLabel url = new JLabel(("<html>     博客:<a href=\"http://hi.baidu.com/godmap\">http://hi.baidu.com/godmap</a><br></html>"));
private JPanel aboutPanel = new JPanel();
private String os = System.getProperty ("os.name");
//初始化窗口
public void init() {
//设置窗口组件基本属性
this.setTitle("子网掩码计算器V1.2.5");
addrField.setToolTipText("格式:172.168.1.2 ……");
addrField.setActionCommand("addr");
addrField.addActionListener(this);
addrField.addKeyListener(this);
maskField.setToolTipText("格式:1~31或255.255.255.0 ……");
maskField.setActionCommand("mask");
maskField.addActionListener(this);
maskField.addKeyListener(this);
calculateButton.setToolTipText("计算结果。");
calculateButton.setActionCommand("calculate");
calculateButton.addActionListener(this);
copyButton.setToolTipText("将计算结果复制到系统剪贴板。");
copyButton.setActionCommand("copy");
copyButton.addActionListener(this);
resetButton.setToolTipText("将输入框清零。");
resetButton.setActionCommand("reset");
resetButton.addActionListener(this);
helpButton.setToolTipText("更多帮助。");
helpButton.setActionCommand("help");
helpButton.addActionListener(this);
outputArea.setToolTipText("Ctrl+A/Ctrl+C复制计算结果。");
outputArea.setEditable(false);
outputPanel.setBorder(new TitledBorder("计算结果"));
outputPanel.add(outputArea);
JScrollPane scrollBar = new JScrollPane(outputArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
outputPanel.add(scrollBar);
//设置关于窗口属性
url.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
url.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
if (os.startsWith ("Windows")) {
try {
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler http://hi.baidu.com/godmap");
} catch (Exception urlException) {
System.out.println("启动浏览器错误:".concat(urlException.toString().concat("\n请手动启动浏览器访问:http://hi.baidu.com/godmap")));
}
}
else
try {
Runtime.getRuntime().exec("mozila http://hi.baidu.com/godmap");
} catch (Exception urlException) {
System.out.println("启动浏览器错误:".concat(urlException.toString().concat("\n请手动启动浏览器访问:http://hi.baidu.com/godmap")));
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
GroupLayout aboutLayout = new GroupLayout(aboutPanel);
aboutLayout.setHorizontalGroup(aboutLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(about)
.addComponent(url));
aboutLayout.setVerticalGroup(aboutLayout.createSequentialGroup()
.addComponent(about)
.addComponent(url));
aboutPanel.setLayout(aboutLayout);
aboutPanel.add(about);
aboutPanel.add(url);
//添加布局管理器
GroupLayout groupLayout = new GroupLayout(getContentPane());
groupLayout.setAutoCreateContainerGaps(true);
groupLayout.setAutoCreateGaps(true);
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addGroup(groupLayout.createParallelGroup()
.addGroup(groupLayout.createSequentialGroup()
.addComponent(addrLabel)
.addComponent(addrField)
.addComponent(maskLabel)
.addComponent(maskField))
.addComponent(outputPanel))
.addGroup(groupLayout.createSequentialGroup()
.addComponent(calculateButton)
.addComponent(copyButton)
.addComponent(resetButton)
.addComponent(helpButton))
);
groupLayout.setVerticalGroup(
groupLayout.createSequentialGroup()
.addGroup(groupLayout.createParallelGroup()
.addComponent(addrLabel)
.addComponent(addrField)
.addComponent(maskLabel)
.addComponent(maskField))
.addComponent(outputPanel)
.addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
.addComponent(calculateButton)
.addComponent(copyButton)
.addComponent(resetButton)
.addComponent(helpButton))
);
getContentPane().setLayout(groupLayout);
//输出窗口
pack();
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation((screenSize.width-getWidth())/2, (screenSize.height-getHeight())/2);
setVisible(true);
}
//事件监听
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("calculate")) {
outputArea.setText(this.getIPMask(deSpace(addrField), deSpace(maskField)));
outputArea.setCaretPosition(0);
}
else if(e.getActionCommand().equals("copy")) {
this.outputArea.selectAll();
this.outputArea.copy();
}
else if(e.getActionCommand().equals("reset")) {
this.addrField.setText("");
this.maskField.setText("");
}
else if(e.getActionCommand().equals("help")) {
JOptionPane.showMessageDialog(null, aboutPanel, "关于", JOptionPane.INFORMATION_MESSAGE );
}
else ;
}
//键盘监听
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==10) {
this.calculateButton.doClick();
}
}
public void keyTyped(KeyEvent e) {
}
//主方法
public String getIPMask(String ipAddr, String maskAddr) {
String outputMaskInfo = "非法IP或子网掩码地址。";
//非法IP或子网掩码地址,不进行计算。
if(!isValidIP(ipAddr) || !isValidMask(maskAddr))
return outputMaskInfo;
//合法IP、子网掩码,开始计算。
if(maskAddr.indexOf(".") == -1)
maskAddr = getMask(Byte.parseByte(maskAddr));
String[] ipSplit = {"0","0","0","0"};
String[] maskSplit = {"0","0","0","0"};
ipSplit = ipAddr.split("\\.");
maskSplit = maskAddr.split("\\.");
String ip = "";
String mask = "";
String netIP = "";
String broadcastIP = "";
String startIP = "";
String endIP = "";
String binaryMask = "";
String addrType = "";
//String hostIP = "";
int hostNum = 0;
//int subNetNum = 0;
int subNetMaxNum = 0;
for(int i = 0; i < 4; i++) {
int ipTemp = Integer.parseInt(ipSplit[i]);
int maskTemp = Integer.parseInt(maskSplit[i]);
//地址类型
if(i == 0) {
if(ipTemp == 127)
addrType = "回环地址:";
else if(ipTemp < 127)
addrType = "A类地址:";
else if(ipTemp < 192)
addrType = "B类地址:";
else if(ipTemp < 224)
addrType = "C类地址:";
else if(ipTemp < 240)
addrType = "D类(组播)地址:";
else if(ipTemp < 255)
addrType = "E类(保留)地址:";
}
//用户输入的IP
ip = ip.concat(Integer.toString(ipTemp)).concat(".");
//用户输入的子网掩码
mask = mask.concat(Integer.toString(maskTemp)).concat(".");
//网络地址
netIP = netIP.concat(Integer.toString(ipTemp & maskTemp)).concat(".");
//广播地址
broadcastIP = broadcastIP.concat(Integer.toString(~maskTemp+256 | ipTemp)).concat(".");
//主机地址
//hostIP = hostIP.concat(Integer.toString(~maskTemp & ipTemp)).concat(".");
//可分配主机地址
if(i < 3) {
startIP = startIP.concat(Integer.toString(ipTemp & maskTemp)).concat(".");
endIP = endIP.concat(Integer.toString(~maskTemp+256 | ipTemp)).concat(".");
}
else if(i == 3) {
if(maskTemp != 254) {
startIP = startIP.concat(Integer.toString((ipTemp & maskTemp) + 1)).concat(".");
endIP = endIP.concat(Integer.toString((~maskTemp+256 | ipTemp) - 1)).concat(".");
}
else {
startIP = "无.";
endIP = "无.";
}
}
//生成连续的二进制子网掩码,以计算可用主机数
binaryMask = binaryMask.concat(Integer.toBinaryString(maskTemp));
}
//可用主机数
hostNum = (int)Math.pow(2, 32 - this.getMaskBit(binaryMask)) - 2;
//可划分子网数
subNetMaxNum = (int)(32-getMaskBit(binaryMask)-2 > 0 ? Math.pow(2, 32-getMaskBit(binaryMask)-2):0);
//计算子网
outputMaskInfo = addrType.concat(ip.substring(0, ip.length() - 1)).concat("/").concat(mask.substring(0, mask.length() - 1))
.concat("的\n网络地址是:").concat(netIP.substring(0, netIP.length() - 1))
.concat("\n广播地址是:".concat(broadcastIP.substring(0, broadcastIP.length() - 1))
.concat("\n可分配主机地址包括:").concat(startIP.substring(0, startIP.length() - 1)).concat("~").concat(endIP.substring(0, endIP.length() - 1))
.concat("\n可用主机数共:").concat(Integer.toString(hostNum)).concat("台")
.concat("\n最多可划分:") .concat(Integer.toString(subNetMaxNum).concat("个子网\n")));
//.concat(this.getIPMask(false)));
return outputMaskInfo;
}
//计算子网分配方案
public String getSubNet() {
String subNetInfo = "子网分配方案如下:\n";
for(int i=0; i<this.getIPMask("","").indexOf("a"); i++) {
}
return subNetInfo;
}
//转换十进制掩码为IP地址格式掩码
public String getMask(byte maskBit) {
if(maskBit == 1)
return "128.0.0.0";
else if(maskBit == 2)
return "192.0.0.0";
else if(maskBit == 3)
return "224.0.0.0";
else if(maskBit == 4)
return "240.0.0.0";
else if(maskBit == 5)
return "248.0.0.0";
else if(maskBit == 6)
return "252.0.0.0";
else if(maskBit == 7)
return "254.0.0.0";
else if(maskBit ==
return "255.0.0.0";
else if(maskBit ==9)
return "255.128.0.0";
else if(maskBit == 10)
return "255.192.0.0";
else if(maskBit == 11)
return "255.224.0.0";
else if(maskBit == 12)
return "255.240.0.0";
else if(maskBit == 13)
return "255.248.0.0";
else if(maskBit == 14)
return "255.252.0.0";
else if(maskBit == 15)
return "255.254.0.0";
else if(maskBit == 16)
return "255.255.0.0";
else if(maskBit == 17)
return "255.255.128.0";
else if(maskBit == 18)
return "255.255.192.0";
else if(maskBit == 19)
return "255.255.224.0";
else if(maskBit == 20)
return "255.255.240.0";
else if(maskBit == 21)
return "255.255.248.0";
else if(maskBit == 22)
return "255.255.252.0";
else if(maskBit == 23)
return "255.255.254.0";
else if(maskBit == 24)
return "255.255.255.0";
else if(maskBit == 25)
return "255.255.255.128";
else if(maskBit == 26)
return "255.255.255.192";
else if(maskBit == 27)
return "255.255.255.224";
else if(maskBit == 28)
return "255.255.255.240";
else if(maskBit == 29)
return "255.255.255.248";
else if(maskBit == 30)
return "255.255.255.252";
else if(maskBit == 31)
return "255.255.255.254";
else if(maskBit == 32)
return "255.255.255.255";
return "";
}
//判断IP是否合法
public boolean isValidIP(String ip) {
if(ip.indexOf(".") == -1)
return false;
String[] ipSplit = ip.split("\\.");
int ipNum = 0;
if (ipSplit.length != 4)
return false;
for (int i = 0; i < ipSplit.length; i++) {
try {
ipNum = Integer.parseInt(ipSplit[i]);
}catch(Exception e) {
return false;
}
if(ipNum < 0 || ipNum > 255)
return false;
if(i == 0)
if(ipNum == 0 || ipNum == 255)
return false;
}
return true;
}
//判断子网掩码是否合法
public boolean isValidMask(String mask) {
int maskNum = 0;
int maskBit = 0;
//十进制掩码
if(mask.indexOf(".") == -1) {
try {
maskBit = Byte.parseByte(mask);
}catch(Exception e) {
return false;
}
if(maskBit > 31 || maskBit < 1) {
return false;
}
return true;
}
//IP格式掩码
String[] maskSplit = mask.split("\\.");
String maskBinString = "";
if(maskSplit.length != 4)
return false;
//将大于128的4个掩码段连成2进制字符串
for(int i=0; i<maskSplit.length; i++) {
try {
maskNum = Integer.parseInt(maskSplit[i]);
}catch(Exception e) {
return false;
}
//首位为0,非法掩码
if(i == 0 && Integer.numberOfLeadingZeros(maskNum) == 32)
return false;
//非0或128~255之间,非法掩码
if(Integer.numberOfLeadingZeros(maskNum) != 24)
if(Integer.numberOfLeadingZeros(maskNum) != 32)
return false;
//将大于128的掩码段连接成完整的二进制字符串
maskBinString = maskBinString.concat(Integer.toBinaryString(maskNum));
}
//二进制掩码字符串,包含非连续1时,非法掩码
if(maskBinString.indexOf("0") < maskBinString.lastIndexOf("1"))
return false;
//剩下的就是合法掩码
return true;
}
//识别掩码位数
public int getMaskBit(String binaryMask) {
return binaryMask.lastIndexOf("1") + 1;
}
//过滤空格
public String deSpace(JTextField textField) {
String curStr = null;
String outStr = "";
for (int i = 0; i < textField.getText().length(); i++) {
curStr = textField.getText().substring(i, i + 1);
if (!curStr.equals(" ")) {
outStr += curStr;
}
}
return outStr;
}
}