24小时热门版块排行榜    

查看: 289  |  回复: 0
当前主题已经存档。

aisingioro

金虫 (正式写手)


[资源] 【原创】多线程端口扫描(Java)【已搜无重复】

最近复习Java,准备考试,写了个多线程端口扫描的小程序,请大家指教。
源代码如下:
===============================================
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


class scanPort extends Thread{
    String host;
    int startPort;
    int endPort;
    int tag;
    display d;
   
    volatile boolean runStatus;
        
    scanPort(String h,int sp,int ep,int tg,display dis){
        super();
        host=h;
        startPort=sp;
        endPort=ep;
        tag=tg;
        d=dis;
        runStatus=true;
    }
    public synchronized void goRun()  {
            try{
                   runStatus=true;
             notify();
         //    System.out.println("notify");
            }catch(Exception e){
                    System.out.println(e.toString());
            }
    }

    public synchronized void goWait() throws InterruptedException{
            try{
           while (runStatus==false){
              wait();
           }
        }catch(Exception e){
                    System.out.println(e.toString());
            }
    }   
    public void  run(){
        for(int i=startPort;i<=endPort;i++){
            try{
                goWait();
                Socket s=new Socket(host,i);
                synchronized (d.jTextArea1){
                    d.jTextArea1.setText(d.jTextArea1.getText()+"Host:"+host.toString()+" Port: "+i+" is Opening."+tag+"线程"+"\n");
                }               
            }
            catch(IOException  e){
                synchronized (d.jTextArea1){
                    d.jTextArea1.setText(d.jTextArea1.getText()+"Host:"+host.toString()+" Port: "+i+" is Closed."+tag+"线程"+"\n");
                }               
            }
            catch(InterruptedException e){
                System.out.println(e.toString());
            }
        }
    }
}
class display extends JFrame {

    int threadNumber;
    int start;
    int end;
    String host;
    scanPort s[];
    int status;
   
   
    JButton jButton1;
    JButton jButton2;
    JButton jButton3;
    JLabel jLabel1;
    JLabel jLabel2;
    JLabel jLabel3;
    JLabel jLabel4;
    JMenu jMenu1;
    JMenuBar jMenuBar1;
    JMenuItem jMenuItem1;
    JScrollPane jScrollPane1;
    JTextArea jTextArea1;
    JTextField jTextField1;
    JTextField jTextField2;
    JTextField jTextField3;
   
    selectThreadNumber se;
   
    public display() {
           
           threadNumber=1;
           status=0;
           
           jButton1=new JButton("开始扫描");
           jButton2=new JButton("暂停扫描");
           jButton3=new JButton("停止扫描");
           jLabel1=new JLabel("请输入要扫描的IP地址:");
           jLabel2=new JLabel("开始端口:");
           jLabel3=new JLabel("结束端口:");
           
           jMenuBar1=new JMenuBar();
           jMenu1=new JMenu("设置");
           jMenuItem1=new JMenuItem("设置线程数:");
           jMenu1.add(jMenuItem1);
           jMenuBar1.add(jMenu1);
           
           jTextArea1=new JTextArea();
           jScrollPane1=new JScrollPane(jTextArea1);
                                 
           jTextField1=new JTextField();
           jTextField2=new JTextField("0");
           jTextField3=new JTextField("65535");   
           
           this.add(jMenuBar1);
           this.add(jLabel1);
           this.add(jTextField1);
           this.add(jLabel2);
           this.add(jTextField2);
           this.add(jLabel3);
           this.add(jTextField3);
           this.add(jButton1);
           this.add(jButton2);
           this.add(jButton3);
           this.add(jScrollPane1);
           
           this.setLayout(null);
           jMenuBar1.setSize(300, 20);
           jMenuBar1.setLocation(0, 0);
           jLabel1.setSize(150, 20);
           jLabel1.setLocation(0,30);
           jTextField1.setSize(140, 20);
           jTextField1.setLocation(150,30);
           jLabel2.setSize(80,20);
           jLabel2.setLocation(0,60);
           jTextField2.setSize(60,20);
           jTextField2.setLocation(70,60);
           jLabel3.setSize(80,20);
           jLabel3.setLocation(150,60);
           jTextField3.setSize(60,20);
           jTextField3.setLocation(220,60);
           jButton1.setSize(90,20);
           jButton1.setLocation(5, 90);
           jButton2.setSize(90,20);
           jButton2.setLocation(100, 90);
           jButton3.setSize(90,20);
           jButton3.setLocation(195, 90);
           jScrollPane1.setSize(300,150);
           jScrollPane1.setLocation(0,120);   
           
           jButton1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                   jButton1ActionPerformed(e);                  
               }
           });
           
           jButton2.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                   jButton2ActionPerformed(e);
               }
           });
           
           jButton3.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                   jButton3ActionPerformed(e);
               }
           });
           
           jMenuItem1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                   jMenuItem1ActionPerformed(e);
               }
           });           
    }   
     
    private void jButton1ActionPerformed(ActionEvent evt) {                                         
        s=new scanPort[threadNumber];
        host=jTextField1.getText();
        end=Integer.parseInt(jTextField3.getText());
        start=Integer.parseInt(jTextField2.getText());
        int theNumberOfPort=end-start+1;
        int everyThread[][]=new int[threadNumber][2];
        for(int i=0;i             everyThread[0]=(theNumberOfPort/threadNumber)*i+start;
            if((everyThread[0]+theNumberOfPort/threadNumber-1)<=end){
                everyThread[1]=everyThread[0]+theNumberOfPort/threadNumber-1;
            }
            else{
                everyThread[1]=end;
            }
            s=new scanPort(host,everyThread[0],everyThread[1],i+1,this);
            s.start();
        }                     
    }   
    private void jButton2ActionPerformed(ActionEvent evt) {
        if(status==0){
          jButton2.setText("继续扫描");
          status=1;
          for(int i=0;i                s.runStatus=false;               
          }
       }
       else{
         jButton2.setText("暂停扫描");
         status=0;   
         for(int i=0;i             
              s.goRun();                                    
        }
      }  
  }
    private void jButton3ActionPerformed(ActionEvent evt) {
        status=0;
        for(int i=0;i                 s.stop();
         }
    }
   
    private void jMenuItem1ActionPerformed(ActionEvent evt){
        selectThreadNumber sel=new selectThreadNumber(this);
        sel.addWindowListener(new WindowAdapter(){
            public void widnowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        sel.show();  
    }
   
    public static void main(String args[]) {
      display dis=new display();
      dis.setTitle("PortScaner");
      dis.setSize(300, 300);
      dis.addWindowListener(new WindowAdapter(){
          public void windowClosing(WindowEvent e){
              System.exit(0);
          }
      });
      dis.show();
    }
}      

    class selectThreadNumber extends JFrame{
        JComboBox numberOfThread;
        JLabel lb1;
        JButton btn1;
        JButton btn2;
        int thNum;
        display d;
        
        selectThreadNumber(display dis){
           d=dis;
           
           lb1=new JLabel("请选择线程数: ");
           btn1=new JButton("确定");
           btn2=new JButton("取消");
            
           numberOfThread=new JComboBox();
           numberOfThread.addItem("1");
           numberOfThread.addItem("2");
           numberOfThread.addItem("3");
           numberOfThread.addItem("4");
           numberOfThread.addItem("5");
           numberOfThread.addItem("6");
           numberOfThread.addItem("7");
           numberOfThread.addItem("8");
           numberOfThread.addItem("9");
           numberOfThread.addItem("10");
           numberOfThread.addItem("11");
           numberOfThread.addItem("12");
           numberOfThread.addItem("13");
           numberOfThread.addItem("14");
           numberOfThread.addItem("15");
           numberOfThread.addItem("16");
           
           this.setLayout(null);
           this.add(lb1);
           this.add(numberOfThread);
           this.add(btn1);
           this.add(btn2);
           lb1.setSize(150,20);
           lb1.setLocation(10,10);
           numberOfThread.setSize(100,20);
           numberOfThread.setLocation(170,10);
           btn1.setSize(70,20);
           btn1.setLocation(30,50);
           btn2.setSize(70,20);
           btn2.setLocation(180,50);
           this.setSize(300, 100);
           this.setTitle("Select thread number");
           
           btn1.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e){
                   btn1ActionPerformed(e);
               }
           });
           
           
           btn2.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e){
                   btn2ActionPerformed(e);
               }
           });
        }
        
        private void btn1ActionPerformed(ActionEvent evt){
            thNum=numberOfThread.getSelectedIndex()+1;   
            this.setVisible(false);
            d.threadNumber=thNum;
        }
        private void btn2ActionPerformed(ActionEvent evt){
            this.dispose();
        }
    }
===============================================
保存为scaner.java
jdk1.6.0编译通过并正确运行!

[ Last edited by bslt on 2009-4-14 at 18:00 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 aisingioro 的主题更新
☆ 无星级 ★ 一星级 ★★★ 三星级 ★★★★★ 五星级
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +5 ASdOkHsho7FD 2026-08-28 6/300 2026-08-30 01:03 by ZPa0EcMwuECS
[基金申请] 投票:  有多少人是今天查系统知道结果的? +16 爱看书的可乐 2026-08-26 18/900 2026-08-30 00:59 by winsaint
[硕博家园] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +6 ASdOkHsho7FD 2026-08-28 10/500 2026-08-30 00:53 by ZPa0EcMwuECS
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +5 ASdOkHsho7FD 2026-08-28 7/350 2026-08-30 00:52 by ZPa0EcMwuECS
[考研] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +7 ASdOkHsho7FD 2026-08-28 10/500 2026-08-30 00:41 by ZPa0EcMwuECS
[硕博家园] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +6 ASdOkHsho7FD 2026-08-28 12/600 2026-08-30 00:31 by ZPa0EcMwuECS
[考研] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +4 G6APbkg8SA6w 2026-08-29 4/200 2026-08-29 22:27 by ZPa0EcMwuECS
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 gy1nBQXYQJqL 2026-08-29 5/250 2026-08-29 21:33 by 4qO8zhfjr2AX
[公派出国] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 gy1nBQXYQJqL 2026-08-29 3/150 2026-08-29 21:32 by 4qO8zhfjr2AX
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 gy1nBQXYQJqL 2026-08-29 6/300 2026-08-29 21:22 by 4qO8zhfjr2AX
[基金申请] 有没有仍没收到信息的 +5 德尚中行 2026-08-27 6/300 2026-08-29 18:10 by manplx
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +5 yuleib84 2026-08-26 6/300 2026-08-28 00:02 by yudaoqian88
[基金申请] 基金未中,这种答复是模板吗? +5 zhaosm1982 2026-08-27 6/300 2026-08-27 16:00 by lfy8008
[文学芳草园] 梦想 +3 myrtle 2026-08-26 3/150 2026-08-27 10:01 by angelyueyi
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +7 process2012 2026-08-23 10/500 2026-08-26 19:23 by hmhminy
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 明天应该可查了!? +6 chengyan1220 2026-08-23 6/300 2026-08-25 19:45 by zfd97
[基金申请] 某些机构,以效率低为荣,以效率低作为存在感 +9 yuleib84 2026-08-25 10/500 2026-08-25 17:14 by alexon
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
信息提示
请填处理意见