一个简单的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();

    }

}

程序运行结果如下:

Java扫描端口的程序


本人菜鸟一个,代码冗余多,错误之处望指出;大神请绕过。

相关文章: