一个简单的Java端口扫描程序(含窗体和线程),通过各种百度,总算勉强完成。
以下是代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Demo1 extends JFrame{
// private static final long serialVersionUID = 1L;
JFrame frame=new JFrame("Java端口扫描器");//创建窗口
JPanel panel=new JPanel();// 创建一个面板
// 设置标签
JLabel iplabel=new JLabel("输入IP");
JTextField ipField=new JTextField("127.0.0.1",12);
JLabel portlabel1=new JLabel("输入开始端口");
JTextField portField1=new JTextField("0",7);
JLabel portlabel2=new JLabel("输入结束端口");
JTextField portField2=new JTextField("65535",7);
JLabel timeoutlabel=new JLabel("输入超时毫秒值");
JTextField timeoutField=new JTextField("1000",7);
JLabel threadlabel=new JLabel("输入线程数");
JTextField threadField=new JTextField("5",7);
JButton button=new JButton("开始");
// 内容输入框
JLabel textlabel=new JLabel("端口扫描结果");
JTextArea area=new JTextArea();
JScrollPane jScrollPane = new JScrollPane(area);
public Demo1() {
panel.setBackground(Color.pink);//设置面板背景色
frame.add(panel,BorderLayout.NORTH);// 将面板添加到窗体
panel.add(iplabel);
panel.add(ipField);
// 给输入框添加事件
ipField.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// super.mouseClicked(e);
JTextField field=(JTextField) e.getSource();
if (field.getText().equals("127.0.0.1")) {
field.setText("");
}
}
});
panel.add( portlabel1);
panel.add(portField1);
// 给输入框添加事件
portField1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// super.mouseClicked(e);
JTextField field=(JTextField) e.getSource();
if (field.getText().equals("0")) {
field.setText("");
}
}
});
panel.add( portlabel2);
panel.add(portField2);
// 给输入框添加事件
portField2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// super.mouseClicked(e);
JTextField field=(JTextField) e.getSource();
if (field.getText().equals("65535")) {
field.setText("");
}
}
});
panel.add( timeoutlabel);
panel.add(timeoutField);
// 给输入框添加事件
timeoutField.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// super.mouseClicked(e);
JTextField field=(JTextField) e.getSource();
if (field.getText().equals("1000")) {
field.setText("");
}
}
});
panel.add(threadlabel);
panel.add(threadField);
// 给输入框添加事件
threadField.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
// super.mouseClicked(e);
JTextField field=(JTextField) e.getSource();
if (field.getText().equals("5")) {
field.setText("");
}
}
});
panel.add(button);
area.setLineWrap(true);//设置自动换行
frame.add(jScrollPane,BorderLayout.CENTER);
Toolkit toolkit=Toolkit.getDefaultToolkit();
// 获取屏幕的分辨率
Dimension dimension=toolkit.getScreenSize();
int x=(int) dimension.getWidth();
int y=(int) dimension.getHeight();
frame.setBounds((x-800)/2, (y-600)/2, 1000, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String ip2=ipField.getText();
// int port=0;
int portMin2=Integer.parseInt(portField1.getText());
int portMax2=Integer.parseInt(portField2.getText());
int timeout2=Integer.parseInt(timeoutField.getText());
int threadNumber2=Integer.parseInt(threadField.getText());
area.append(ip2+"的端口扫描结果:\n");
scan(ip2, portMin2, portMax2, timeout2, threadNumber2);
area.append("扫描结束。\n");
}catch(Exception e3) {
e3.printStackTrace();
}
}
});
}
public void scan(String ip,int portMin,int portMax,int timeout,int threadNumber) {
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i < threadNumber; i++) {
RunnableImpl runnableImpl = new RunnableImpl(ip,portMin,portMax,timeout,threadNumber,i);
threadPool.execute(runnableImpl);
}
threadPool.shutdown();
while (!threadPool.isTerminated()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private class RunnableImpl implements Runnable{
private String ip;
private int portMin;
private int portMax;
private int timeout;
private int threadNumber;
private int serial;
public RunnableImpl(String ip,int portMin,int portMax,int timeout,int threadNumber,int serial) {
// TODO Auto-generated constructor stub
this.ip=ip;
this.portMin=portMin;
this.portMax=portMax;
this.timeout=timeout;
this.threadNumber=threadNumber;
this.serial=serial;
}
@Override
public void run() {
// TODO Auto-generated method stub
int port=0;
// area.append(ip+"的端口扫描结果:\n");
try {
InetAddress address = InetAddress.getByName(ip); //如果输入的是主机名,尝试获取ip地址
Socket socket;//定义套接字
SocketAddress socketAddress;//传递ip和端口
for (port =portMin+serial; port <= portMax; port+=threadNumber) {
socket = new Socket();
//为对象分配内存空间
socketAddress = new InetSocketAddress(address, port);
try {
socket.connect(socketAddress, timeout);
//对目标主机的指定端口进行连接,超时后连接失败
socket.close();
//关闭端口
area.append("端口 " + port + " :开放\n");
} catch (IOException e1) {
area.append("端口 " + port + " :关闭\n");
}
}
// area.append("扫描结束。\n");
}catch(Exception e2) {
area.append("输入有误,请重新输入!\n");
}
}
}
public static void main(String[] args) throws Exception {
new Demo1();
}
}
程序运行结果如下:
本人菜鸟一个,代码冗余多,错误之处望指出;大神请绕过。