在图形界面的文本框中输入主机名(域名),在下面的文本区中显示其IP地址信息;如果输入IP地址,则显示其主机名。
要求:
1) 如果在文本框中输入的是主机名,要求查询出其对应的所有IP地址。
2) 编写合适的方法,检测用户输入的是域名还是IP地址。
3) 当用户输入的信息无法被转换成正确的域名和IP地址时,需要给出适当的提示信息。
主要代码:
Address_Resolution.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.UnknownHostException;
// 输入一个域名可以解析出对应的ip地址的信息
// JFrame窗口类
// ActionListener设置点击事件的
public class Address_Resolution extends JFrame implements ActionListener{
JLabel labelOfAddress;//提示要输入的信息
JTextField textFldOfURLAddress;//接收输入的信息
JButton okBtn;//确定的按钮
JTextArea textFldOfResult;//显示结果
//构造方法
public Address_Resolution() {
this.setTitle("域名解析");
//lable设置
labelOfAddress = new JLabel("输入主机名或者IP地址:");
textFldOfURLAddress = new JTextField(20);
okBtn = new JButton("确定");
//设置事件监听器。将this传入,相当于setXxxListener
okBtn.addActionListener(this);
textFldOfURLAddress.addActionListener(this);
//设置第一行的显示的内容
JPanel jp1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
jp1.add(labelOfAddress);
jp1.add(textFldOfURLAddress);
jp1.add(okBtn);
//BorderLayout.NORTH表示沿水平方向排列。
this.add(jp1,BorderLayout.NORTH);
//显示结果的信息
textFldOfResult = new JTextArea();
//只显示不能编辑
textFldOfResult.setEditable(false);
this.add(textFldOfResult);
//设置为位置和宽度大小
this.setLocation(460,100);
this.setSize(600,400);
this.setVisible(true);
//关闭的操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//重写的事件监听的方法,用于设置按钮的点击事件,当按钮发生变化了就会
// 点击确定按钮或者是回车都会触发查询的事件
// getSource()方法返回的是对象的本身,而不是对象的引用。
public static boolean isIP(String ip) {
//记录是不是4组
try{
int count = 0;
String[] temp = ip.split("\\.");
for (int i = 0; i < temp.length; i++) {
//isNumeric判断是不是数字的
if(isNumeric(temp[i]) && 0<Integer.parseInt(temp[i]) && Integer.parseInt(temp[i])<256) {
count++;
}
}
if(count == 4) {
return true;
} else {
return false;
}
}
catch (Exception e){
return false;
}
}
// 判断输入的是否是ip地址
// 简介:根据输入的.进行分割4组
public static boolean isNumeric(String str) {
try {
new BigDecimal(str).toString();
}
//异常 说明包含非数字
catch (Exception e) {
return false;
}
return true;
}
// 判断字符串是否是数字
// 判断依据:根据强制转换出来的数据是不是发生异常信息来判断是不是发生异常的信息
// BigDecimal是一种数值类型,它可以用来表示非常大的数字
// 测试程序
public static void main(String[] args) {
new Address_Resolution();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == okBtn || e.getSource() == textFldOfURLAddress) {
//获取用户输入的数据
String dnOrIp = textFldOfURLAddress.getText().trim();
try {
//不是数字的ip地址的时候,解析域名
if (!isIP(dnOrIp)) {
// getAllByName,获取该hostname下的所有的ip的信息
// getHostAddress获取ip的信息
InetAddress[] allByName = InetAddress.getAllByName(dnOrIp);
textFldOfResult.setText(dnOrIp + "的IP地址为:\n");
//读取所有的ip的信息
for (InetAddress net:allByName) {
textFldOfResult.append(net.getHostAddress() + "\n");
}
}
//解析ip,输出域名。貌似没有效果
else {
InetAddress address = InetAddress.getByName(dnOrIp);
textFldOfResult.setText(dnOrIp + "的域名为:\n");
textFldOfResult.append(address.getHostName());
}
}
catch (UnknownHostException e1) {
System.out.println("出错了:"+e1.getMessage()+"不正确");
textFldOfResult.setText("出错了:"+e1.getMessage()+"不正确");
}
}else {
textFldOfResult.setText("您输入的数据不合法,请检查后重新数据!");
}
}
}
主要流程图:
运行结果截图: