多线程实现端口扫描

  1 import java.net.*;
  2 import java.io.*;
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 import javax.swing.*;
  6 
  7 public class TcpThread extends Thread{
  8     
  9     //定义变量
 10     public static InetAddress hostAddress;//主机IP地址
 11     public static int MIN_port;            //The minimal number of port
 12     public static int MAX_port;            //The maximal number of port
 13     private int NUM_thread;                //线程总数
 14     public static int type;                //查询方式,0为IP方式1为主机名查询方式
 15     
 16     public static int ip1;//IP前三位
 17     public static int ip2;//IP4~6位
 18     public static int ip3;//IP7~9位
 19     public static int ipstart;//起始IP地址最后四位
 20     public static int ipend;//结束IP地址最后四位
 21     public static String ipAll;//完整的IP地址
 22     
 23     String nameHost = "";//扫描的主机名称或IP地址
 24     String typeport = "0";//端口类别
 25     
 26     /**
 27      * 构造函数
 28      */
 29     public TcpThread( String name, int numthread ){
 30         super(name);
 31         this.NUM_thread = numthread;
 32     }
 33     
 34     /**
 35      * run()运行函数
 36      */
 37     public void run( ) {
 38         
 39         int h = 0;//IP address
 40         int i = 0;//port number
 41         
 42         Socket theTcpSocket;
 43         
 44         //根据IP地址进行扫描
 45         if( 0 == type ){
 46             //IP地址循环扫描
 47             for( h = ipstart; h <= ipend; h++){
 48                 ipAll = "" + ip1 + "." + ip2 + "." + ip3 + "." + h;
 49                 nameHost = ipAll;
 50                 
 51                 try{
 52                     hostAddress = InetAddress.getByName( ipAll );
 53                 }catch( UnknownHostException e){}
 54                 
 55                 //不同端口循环扫描
 56                 for( i = MIN_port; i < MAX_port + Integer.parseInt( ThreadScan.maxThread.getText() );
 57                         i += Integer.parseInt(ThreadScan.maxThread.getText() ) ){
 58                     try{
 59                         theTcpSocket = new Socket(hostAddress, i);
 60                         theTcpSocket.close();
 61                         
 62                         ThreadScan.Result.append( nameHost +":"+i);
 63                         
 64                         switch( i ){//其实这儿可以不用switch,直接用个hash表记录就可以
 65                             case 21:
 66                                 typeport = "(FTP)";
 67                                 break;
 68                             case 23:
 69                                 typeport = "(TELNET)";
 70                                 break;
 71                             case 25:
 72                                 typeport = "SMTP";
 73                                 break;
 74                             case 80:
 75                                 typeport = "HTTP";
 76                                 break;
 77                             case 110:
 78                                 typeport = "POP";
 79                                 break;
 80                             case 139:
 81                                 typeport = "netBIOS";
 82                                 break;
 83                             case 1433:
 84                                 typeport = "SQL Server";
 85                                 break;
 86                             case 3389:
 87                                 typeport = "Terminal Service";
 88                                 break;
 89                             case 443:
 90                                 typeport = "HTTPS";
 91                                 break;
 92                             case 1521:
 93                                 typeport = "Oracle";
 94                                 break;
 95                         }
 96                         
 97                         //端口没有特定类型
 98                         if( typeport.equals("0")){
 99                             ThreadScan.Result.append("\n");
100                         }else{
101                             ThreadScan.Result.append(":" + typeport + "\n");
102                         }            
103                     }catch( IOException e){}
104                 }
105             }
106             if( i == MAX_port + Integer.parseInt(ThreadScan.maxThread.getText())){
107                 ThreadScan.Result.append("\n" + "扫描完成...");
108                 //请"确定"按钮设置为可用
109                 if( !ThreadScan.Submit.setEnable( true ) );
110             }
111         }
112         
113         //按主机名进行端口扫描
114         if( 1 == type ){
115             for( i = MIN_port + NUM_thread; i < MAX_port + Integer.parseInt(ThreadScan.maxThread.getText());
116                     i += Integer.parseInt( ThreadScan.maxThread.getText( ) ) ) {
117                 try{
118                     theTcpSocket = new Socket( hostAddress, i );
119                     theTcpSocket.close();
120                     ThreadScan.Result.append(" " + i);
121                     switch( i ){//其实这儿可以不用switch,直接用个hash表记录就可以
122                         case 21:
123                             typeport = "(FTP)";
124                             break;
125                         case 23:
126                             typeport = "(TELNET)";
127                             break;
128                         case 25:
129                             typeport = "SMTP";
130                             break;
131                         case 80:
132                             typeport = "HTTP";
133                             break;
134                         case 110:
135                             typeport = "POP";
136                             break;
137                         case 139:
138                             typeport = "netBIOS";
139                             break;
140                         case 1433:
141                             typeport = "SQL Server";
142                             break;
143                         case 3389:
144                             typeport = "Terminal Service";
145                             break;
146                         case 443:
147                             typeport = "HTTPS";
148                             break;
149                         case 1521:
150                             typeport = "Oracle";
151                             break;
152                     }
153                     if( typeport.equals("0") ){
154                         ThreadScan.Result.append("\n");
155                     }else{
156                         ThreadScan.Result.append(":" + typeport + "\n");
157                     }
158                 }catch( IOException e){
159                     
160                 }
161             }
162             if( i == MAX_port + Integer.parseInt(ThreadScan.maxThread.getText())){
163                 ThreadScan.Result.append("\n" + "扫描完成...");
164                 if( !ThreadScan.Submit.isEnable()){
165                     ThreadScan.Submit.setEnabled( true );
166                 }
167             }        
168         }//End of if
169     }
170 }
  1 import java.net.*;
  2 import java.io.*;
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 import javax.swing.*;
  6 /**
  7  * 实现扫描的主体程序,TreadScan
  8  * @author Administrator
  9  *
 10  */
 11 
 12 public class ThreadScan {
 13     
 14     public static JFrame main = new JFrame("Scaner(V1.0)By Nevermore");    //注册框架类
 15     public static JTextArea Result = new JTextArea("", 4, 40);            //显示扫描结果
 16     public static JScrollPane resultPane = new 
 17             JScrollPane( Result, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
 18             JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 19     
 20     
 21     public static JTextField nameHost = new JTextField("localhost", 8 );//输入主机名文本框
 22     public static JTextField fromip1 = new JTextField("0", 3);            //输入IP地址前三位的文本框
 23     public static JTextField fromip2 = new JTextField("0", 3);            //输入IP地址4~6位的文本框
 24     public static JTextField fromip3 = new JTextField("0", 3);            //输入IP地址7~9位的文本框
 25     public static JTextField fromip4 = new JTextField("0", 3);            //输入IP地址后三位的文本框
 26     
 27     public static JTextField toip = new JTextField("0", 3);                //输入目标IP地址后四位
 28     
 29     public static JTextField minPort = new JTextField("0", 4);            //最小端口输入框
 30     public static JTextField maxPort = new JTextField("1000", 4);        //最大端口输入框
 31     
 32     public static JTextField maxThread = new JTextField("100", 3);        //最大线程数
 33     public static JDialog DLGError = new JDialog(main, "错误!");        //错误提示框
 34     public static JLabel DLGINFO = new JLabel("");
 35     public static JLabel type = new JLabel("请选择:");
 36     //扫描类型
 37     public static JRadioButton radioIP = new JRadioButton("IP地址:");
 38     public static JRadioButton radioHost = new JRadioButton("主机名:", true);
 39     //单选按钮组
 40     public static ButtonGroup group= new ButtonGroup();
 41     public static JLabel p1 = new JLabel("端口范围:");
 42     public static JLabel p2 = new JLabel("~");
 43     public static JLabel p3 = new JLabel("~");
 44     public static JLabel Pdot1 = new JLabel(".");
 45     public static JLabel Pdot2 = new JLabel(".");
 46     public static JLabel Pdot3 = new JLabel(".");
 47     public static JLabel TNUM = new JLabel("线程数:");
 48     public static JLabel RST = new JLabel("扫描结果:");
 49     public static JLabel con = new JLabel("");
 50     //定义按钮
 51     public static JButton Ok = new JButton("确定");
 52     public static JButton Submit = new JButton("开始扫描");
 53     public static JButton Cancel = new JButton("退出");
 54     public static JButton saveButton = new JButton("保存扫描结果");
 55     //菜单栏设计:这一块好好学习学习
 56     public static JMenuBar myBar = new JMenuBar();
 57     public static JMenu myMenu = new JMenu("文件(F)");
 58     public static JMenuItem saveItem = new JMenuItem("保存扫描结果(S)");
 59     public static JMenuItem exitItem = new JMenuItem("退出(Q)");
 60     public static JMenu myMenu2 = new JMenu("帮助");
 61     public static JMenuItem helpItem = new JMenuItem("阅读");
 62     
 63     /**
 64      * 主方法
 65      */
 66     public static void main( String[] argcs ){
 67         main.setSize(500, 400);
 68         main.setLocation(400, 400);
 69         main.setResizable(false);
 70         main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 71         
 72         DLGError.setSize(300, 100);
 73         DLGError.setLocation(400, 400);
 74         //添加"菜单栏"
 75         myMenu.add(saveItem);
 76         myMenu.add(exitItem);
 77         
 78         myMenu2.add(helpItem);
 79         
 80         myBar.add(myMenu);//将菜单条目添加到菜单
 81         myBar.add(myMenu2);
 82         
 83         main.setJMenuBar(myBar);//将菜单添加到框架
 84         //设置热键
 85         myMenu.setMnemonic('F');
 86         saveItem.setMnemonic('S');
 87         //为"另存为"组建设置快捷键CTRL + S
 88         saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
 89         //采用表格包模式布局
 90         Container mPanel = main.getContentPane();
 91         GridBagConstraints c = new GridBagConstraints();
 92         c.insets = new Insets(10, 0, 0, 10);
 93         
 94         c.gridx = 0;// 设置表格坐标
 95         c.gridy = 0;
 96         c.gridwidth = 10;
 97         c.fill = GridBagConstraints.BOTH;
 98         c.anchor = GridBagConstraints.CENTER;
 99         mPanel.add(type, c);
100         
101         group.add(radioIP);
102         group.add(radioHost);
103         
104         c.gridx = 0;
105         c.gridy = 1;
106         c.gridwidth = 1;
107         c.fill = GridBagConstraints.BOTH;
108         c.anchor = GridBagConstraints.CENTER;
109         mPanel.add(radioIP, c);
110         
111         c.gridx = 1;
112         c.gridy = 1;
113         c.gridwidth = 1;
114         c.fill = GridBagConstraints.CENTER;
115         mPanel.add(fromip1, c);
116         
117         c.gridx = 2;
118         c.gridy = 1;
119         c.gridwidth = 1;
120         c.fill = GridBagConstraints.BOTH;
121         mPanel.add(Pdot1, c);
122         
123         c.gridx = 3;
124         c.gridy = 1;
125         c.gridwidth = 1;
126         c.fill = GridBagConstraints.BOTH;
127         c.anchor = GridBagConstraints.CENTER;
128         mPanel.add(fromip2, c);
129         
130         c.gridx = 4;
131         c.gridy = 1;
132         c.gridwidth = 1;
133         c.fill = GridBagConstraints.BOTH;
134         c.anchor = GridBagConstraints.CENTER;
135         mPanel.add(Pdot2, c);
136         
137         c.gridx = 5;
138         c.gridy = 1;
139         c.gridwidth = 1;
140         c.fill = GridBagConstraints.BOTH;
141         c.anchor = GridBagConstraints.CENTER;
142         mPanel.add(fromip3, c);
143         
144         c.gridy = 1;
145         c.gridx = 6;
146         c.gridwidth = 1;
147         c.fill = GridBagConstraints.BOTH;
148         c.anchor = GridBagConstraints.CENTER;
149         mPanel.add(Pdot3, c);
150         
151         
152         c.gridx = 7;
153         c.gridy = 1;
154         c.gridwidth = 1;
155         c.fill = GridBagConstraints.BOTH;
156         c.anchor = GridBagConstraints.CENTER;
157         mPanel.add(fromip4, c);
158         
159         c.gridx = 8;
160         c.gridy = 1;
161         c.gridwidth = 1;
162         c.fill = GridBagConstraints.BOTH;
163         c.anchor = GridBagConstraints.CENTER;
164         mPanel.add(p2, c);
165         
166         c.gridx = 9;
167         c.gridy = 1;
168         c.gridwidth = 1;
169         c.fill = GridBagConstraints.BOTH;
170         c.anchor = GridBagConstraints.CENTER;
171         mPanel.add(toip, c);
172         
173         c.gridx = 0;
174         c.gridy = 2;
175         c.gridwidth = 1;
176         c.fill = GridBagConstraints.BOTH;
177         c.anchor = GridBagConstraints.CENTER;
178         mPanel.add(radioHost, c);
179         
180         c.gridx = 1;
181         c.gridy = 2;
182         c.gridwidth = 3;
183         c.fill = GridBagConstraints.BOTH;
184         c.anchor = GridBagConstraints.CENTER;
185         mPanel.add(nameHost, c);
186         
187         c.gridx = 0;
188         c.gridy = 3;
189         c.gridwidth = 1;
190         c.fill = GridBagConstraints.BOTH;
191         c.anchor = GridBagConstraints.CENTER;
192         mPanel.add(p1, c);
193         
194         c.gridx = 1;
195         c.gridy = 3;
196         c.gridwidth = 1;
197         c.fill = GridBagConstraints.BOTH;
198         c.anchor = GridBagConstraints.CENTER;
199         mPanel.add(minPort, c);
200         
201         c.gridx = 2;
202         c.gridy = 3;
203         c.gridwidth = 1;
204         c.fill = GridBagConstraints.BOTH;
205         c.anchor = GridBagConstraints.CENTER;
206         mPanel.add(p3, c);
207         
208         c.gridx = 3;
209         c.gridy = 3;
210         c.gridwidth = 1;
211         c.fill = GridBagConstraints.BOTH;
212         c.anchor = GridBagConstraints.CENTER;
213         mPanel.add(maxPort, c);
214         
215         c.gridx = 0;
216         c.gridy = 4;
217         c.gridwidth = 1;
218         c.fill = GridBagConstraints.BOTH;
219         c.anchor = GridBagConstraints.CENTER;
220         mPanel.add(TNUM, c);
221         
222         c.gridx = 1;
223         c.gridy = 4;
224         c.gridwidth = 3;
225         c.fill = GridBagConstraints.BOTH;
226         c.anchor = GridBagConstraints.CENTER;
227         mPanel.add(maxThread, c);
228         
229         c.gridx = 0;
230         c.gridy = 5;
231         c.gridwidth = 3;
232         c.fill = GridBagConstraints.BOTH;
233         c.anchor = GridBagConstraints.CENTER;
234         mPanel.add(Submit, c);
235     
236         
237         c.gridx = 3;
238         c.gridy = 5;
239         c.gridwidth = 3;
240         c.fill = GridBagConstraints.BOTH;
241         c.anchor = GridBagConstraints.CENTER;
242         mPanel.add(saveButton, c);
243         
244         c.gridx = 6;
245         c.gridy = 5;
246         c.gridwidth =4;
247         c.fill = GridBagConstraints.BOTH;
248         c.anchor = GridBagConstraints.CENTER;
249         mPanel.add(Cancel, c);
250         
251         c.gridx = 0;
252         c.gridy = 6;
253         c.gridwidth = 10;
254         c.fill = GridBagConstraints.BOTH;
255         c.anchor = GridBagConstraints.CENTER;
256         mPanel.add(RST, c);
257         
258         //设置文本域可以换行
259         Result.setLineWrap(true);
260         //设置文本域不可编辑
261         Result.setEditable(false);
262         
263         
264         c.gridx = 0;
265         c.gridy = 7;
266         c.gridwidth = 10;
267         c.gridheight = 4;
268         c.fill = GridBagConstraints.VERTICAL;
269         c.anchor = GridBagConstraints.CENTER;
270         mPanel.add(resultPane, c);
271         
272         Container dPanel = DLGError.getContentPane();
273         dPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
274         dPanel.add(DLGINFO);
275         dPanel.add(Ok);
276         
277         
278         Submit.addActionListener(new SubmitAction());
279         Cancel.addActionListener(new CancelAction());
280         Ok.addActionListener(new OkAction());
281         
282         //实现保存功能
283         saveItem.addActionListener(new java.awt.event.ActionListener(){
284             public void actionPerformed(java.awt.event.ActionEvent e){
285                 JFileChooser fc = new JFileChooser();
286                 int returnVal = fc.showSaveDialog(null);
287                 //单击保存按钮
288                 if( 0 == returnVal ){
289                     File saveFile = fc.getSelectedFile();
290                     try{
291                         FileWriter writeOut = new FileWriter( saveFile );
292                         writeOut.write(ThreadScan.Result.getText());
293                         writeOut.close();
294                         
295                     }catch( IOException ex ){ System.out.println("保存失败");}
296                 }
297             }
298         });
299         //实现退出功能
300         ActionListener li =  new java.awt.event.ActionListener(){
301             public void actionPerformed(java.awt.event.ActionEvent e){
302                 System.exit(0);
303             }
304         };
305         exitItem.addActionListener(li);
306         //实现帮助功能
307         
308         ActionListener lil =  new java.awt.event.ActionListener(){
309             public void actionPerformed(java.awt.event.ActionEvent e){
310                 new AboutDialog();//
311             }
312         };
313         helpItem.addActionListener(lil);
314         
315         ActionListener lill =  new java.awt.event.ActionListener(){
316             public void actionPerformed(java.awt.event.ActionEvent e){
317                 JFileChooser fc = new JFileChooser();
318                 int returnVal = fc.showSaveDialog(null);
319                 //单击保存按钮
320                 if( 0 == returnVal ){
321                     File saveFile = fc.getSelectedFile();
322                     try{
323                         FileWriter writeOut = new FileWriter(saveFile);
324                         writeOut.write(ThreadScan.Result.getText());
325                         writeOut.close();
326                     }catch(IOException ex ){ System.out.println("保存失败");}
327                 }else{
328                     return;//单击取消
329                 }
330                 
331             }
332         };
333         saveButton.addActionListener(lill);
334         main.setVisible(true);
335     }
336 }
337 /**
338  * 
339  * @author Nevermore
340  *    实现取消功能
341  */
342 class CancelAction implements ActionListener{
343     public void actionPerformed( ActionEvent e){
344         System.exit(0);
345     }
346 }
347 /**
348  * 
349  * @author Nevermore
350  *    实现确定按钮
351  */
352 class SubmitAction implements ActionListener{
353     public void actionPerformed( ActionEvent a){
354         int minPort;
355         int maxPort;
356         int maxThread;
357         
358         int ip1 = 0;
359         int ip2 = 0;
360         int ip3 = 0;
361         int ipstart = 0;
362         int ipend = 0;
363         
364         String ipaddress = "";
365         String nameHost = "";
366         ThreadScan.Result.setText("");
367         if( ThreadScan.Submit.isEnabled()){
368             ThreadScan.Submit.setEnabled(false);
369         }
370         /**
371          * 判断扫描类型
372          * 根据IP地址扫描 type = 0
373          *根据主机名称扫描type = 1
374          */
375         if( ThreadScan.radioIP.isSelected()){
376             TcpThread.type = 0;
377             //判断IP地址的前三位是否是int型
378             try{
379                 ip1 = Integer.parseInt(ThreadScan.fromip1.getText());
380             }catch( NumberFormatException e ){
381                 ThreadScan.DLGINFO.setText("错误的IP地址");
382                 ThreadScan.DLGError.setVisible(true);
383                 return;
384             }
385             try{
386                 ip2 = Integer.parseInt(ThreadScan.fromip2.getText());
387             }catch( NumberFormatException e ){
388                 ThreadScan.DLGINFO.setText("错误的IP地址");
389                 ThreadScan.DLGError.setVisible(true);
390                 return;
391             }
392             try{
393                 ip3 = Integer.parseInt(ThreadScan.fromip3.getText());
394             }catch( NumberFormatException e ){
395                 ThreadScan.DLGINFO.setText("错误的IP地址");
396                 ThreadScan.DLGError.setVisible(true);
397                 return;
398             }
399             try{
400                 ipstart = Integer.parseInt(ThreadScan.fromip4.getText());
401             }catch( NumberFormatException e ){
402                 ThreadScan.DLGINFO.setText("错误的IP地址");
403                 ThreadScan.DLGError.setVisible(true);
404                 return;
405             }
406             try{
407                 ipend = Integer.parseInt(ThreadScan.toip.getText());
408             }catch( NumberFormatException e ){
409                 ThreadScan.DLGINFO.setText("错误的IP地址");
410                 ThreadScan.DLGError.setVisible(true);
411                 return;
412             }
413             
414             //判断是否是合理的IP地址
415             if(ip1 < 0 || ip1 > 255 || ip2 < 0 || ip2 > 255 ||
416                ip3 < 0 || ip3 > 255 || ipstart < 0 || ipstart > 255 ){
417                 ThreadScan.DLGINFO.setText("IP地址为0~255的整数");
418                 ThreadScan.DLGError.setVisible(true);
419                 return ;
420             }else{
421                 TcpThread.ip1 = ip1;
422                 TcpThread.ip2 = ip2;
423                 TcpThread.ip3 = ip3;
424                 TcpThread.ipstart = ipstart;
425             }
426             //判断目标IP地是否合理
427             if( ipend < 0 || ipend > 255 ){
428                 ThreadScan.DLGINFO.setText("目标IP地址的范围是0~255");
429                 ThreadScan.DLGError.setVisible(true);
430                 return;
431             }else{
432                 TcpThread.ipend = ipend;
433             }
434             
435             ipaddress = "" + ip1 + ip2 + ip3 + ipstart;
436             
437             /**
438              * 判断IP地址的有效性
439              */
440             try{
441                 TcpThread.hostAddress = InetAddress.getByName(ipaddress);
442             }catch( UnknownHostException e){
443                 ThreadScan.DLGINFO.setText("错误的IP或IP地址不可到达!");
444                 ThreadScan.DLGError.setVisible(true);
445                 return;
446             }
447             
448             if( ThreadScan.radioHost.isSelected()){
449                 TcpThread.type = 1;
450                 /**
451                  * 判断主机名的有效性
452                  */
453                 try{
454                     TcpThread.hostAddress = InetAddress.getByName(ThreadScan.nameHost.getText());
455                 }catch( UnknownHostException e){ 
456                     ThreadScan.DLGINFO.setText("错误的域名或地址不可到达!");
457                     ThreadScan.DLGError.setVisible(true);
458                     return;
459                 }
460             }
461             /**
462              * 判断端口号的有效性
463              */
464             try{
465                 minPort = Integer.parseInt(ThreadScan.minPort.getText());
466                 maxPort = Integer.parseInt(ThreadScan.maxPort.getText());
467                 maxThread = Integer.parseInt(ThreadScan.maxThread.getText());
468             }catch( NumberFormatException e ){
469                 ThreadScan.DLGINFO.setText("错误的端口号或端口号和线程数必须为整数");
470                 ThreadScan.DLGError.setVisible(true);
471                 return;
472             }
473             /**
474              * 判断最小端口号的有效范围
475              * 判断条件大于0小于65535最大端口号大于最小端口号
476              */
477             if( minPort < 0 || minPort > 65535 || minPort > maxPort ){
478                 ThreadScan.DLGINFO.setText("端口号范围:0~65535,并且最大端口号应大于最小端口号!");
479                 ThreadScan.DLGError.setVisible(true);
480                 return;
481             }else{
482                 TcpThread.MIN_port = minPort;
483             }
484             /**
485              * 判断最大端口号的有效范围
486              */
487             if( maxPort < 0 || maxPort > 65535 || maxPort < minPort ){
488                 ThreadScan.DLGINFO.setText("端口号范围:0~65535,并且最大端口号应大于最小端口号!");
489                 ThreadScan.DLGError.setVisible(true);
490                 return;
491             }else{
492                 TcpThread.MAX_port = maxPort;
493             }
494             /**
495              * 判断线程数的有效范围
496              * 判断条件 大于1且小于200
497              */
498             if( maxThread < 1 || maxThread > 200 ){
499                 ThreadScan.DLGINFO.setText("线程数的有效范围是1~200");
500                 ThreadScan.DLGError.setVisible(true);
501                 return;
502             }
503             ThreadScan.Result.append("线程数" + ThreadScan.maxThread.getText() + "\n");
504             
505             /**
506              * 启动线程
507              */
508             for( int i = 0; i < maxThread; i++ ){
509                 new TcpThread("T" + i, i).start();
510             }
511         }    
512     }
513 }
514 /**
515  * 
516  * @author Administrator
517  *    错误对话框
518  */
519 class OkAction implements ActionListener{
520     public void actionPerformed( ActionEvent e){
521         ThreadScan.DLGError.dispose();
522     }
523 }
import javax.swing.*;
import java.awt.*;

public class AboutDialog extends JDialog{
    JPanel JMainPane = new JPanel();
    JTabbedPane jTabbedPane = new JTabbedPane();
    
    private JPanel JPanel1 = new JPanel();
    private JPanel JPanel2 = new JPanel();
    
    private JTextArea jt1 = new JTextArea(6, 6);
    private JTextArea jt2 = new JTextArea(6, 6);
    
    /**
     * 构造函数
     */
     public AboutDialog(){
         setTitle("Scaner");
         setSize(300,200);
         setResizable(false);
         setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE);
         
         Container c = this.getContentPane();
         
         jt1.setSize(260,200);
         jt2.setSize(260,200);
         jt1.setEditable(false);
         jt2.setEditable(false);
         jt1.setLineWrap(true);
         jt2.setLineWrap(true);
         
         jt1.setText("");
         jt1.setFont(new Font("楷体_GB2312", java.awt.Font.BOLD, 13));
         jt2.setText("");
         jt2.setFont(new Font("楷体_GB2312", java.awt.Font.BOLD, 13));
         
         jt1.setForeground(Color.black);
         jt2.setForeground(Color.black);
         
         JPanel1.add(jt1);
         JPanel2.add(jt2);
         
         jTabbedPane.setSize(300,200);
         jTabbedPane.addTab("扫描原理", null, JPanel1, null);
         jTabbedPane.addTab("使用说明", null, JPanel2, null);
         JMainPane.add(jTabbedPane);
         c.add(JMainPane);
         pack();
         this.setVisible(true);
     }
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值