应用软件设计.docx
《应用软件设计.docx》由会员分享,可在线阅读,更多相关《应用软件设计.docx(10页珍藏版)》请在冰豆网上搜索。
应用软件设计
信息工程学院
应用软件课程设计论文
(2006~2007学年第一学期)
论文题目:
基于JAVA的多线程
TCP端口扫描程序
姓名:
陈兵
专业:
计算机科学与技术
年级班级:
2003级2班
指导教师:
刘全中
完成日期:
2007-1-24
基于JAVA的多线程TCP端口扫描程序
摘要:
本论文是一个以JAVA编写的GUI界面多线程端口扫描程序,实现输入局域网内的一个IP地址,以及端口的范围和启动的线程数来扫描该计算机中的开放端口的功能。
通过使用JAVA中的socket()方法来创建一个流套接字并将其连接到指定IP地址的指定端口。
关键词:
端口扫描,多线程,socket。
一、任务描述及相关采用技术
1.任务描述
用JAVA编写的一个GUI界面的多线程端口扫描程序,要求输入局域网内的一个IP地址,以及端口的范围和启动的线程数来扫描该计算机中的开放端口。
并实时显示扫描情况。
如果是特定端口,比如21(FTP),23(TELNET),25(SMTP),80(HTTP)时应注明。
2.开发工具及相关采用技术
开发平台:
WindowsXP+JDK1.5
开发工具:
JCreatorPro3.5
开发语言:
Java
二、设计思路及实现过程
首先实现GUI界面,然后对输入的IP、端口和线程数进行处理。
最后将处理结果捕获,在JTextArea区域中显示出来。
界面设计部分相对简单,主要是使用swing设计,由于对swing不熟悉,在面板组件布局时遇到些困难。
连接局域网主机通过使用JAVA中的socket()方法来创建一个流套接字并将其连接到指定IP地址的指定端口。
通过继承Thread类,生成MyThread类,来实现多线程的创建和对指定IP、指定端口的处理。
设计流程图如图1:
三、功能测试及代码
程序运行,界面如图2所示:
输入的查询条件必须满足以下条件:
IP为局域网内的任一IP,端口值范围为:
0-65535,并且开始端口值要小于结束端口值。
线程数范围为1-1000。
图2
输入要查询的主机IP、端口范围、线程数后,点击“确定”后,结果如图3所示:
图3
若输入条件不符合条件,则抛出错误信息如下:
(1)IP地址不符合“xxx.xxx.xxx.xxx,且xxx为0-255”的条件,则抛出错误信息,如图4所示。
图4
(2)端口值不符合“端口值范围为:
0-65535,并且开始端口值要小于结束端口值”的条件,则抛出错误信息,如图5所示。
图5
(3)线程数不符合“线程数必须在1-1000范围内”的条件,抛出错误信息,如图6:
图6
主要代码:
线程类MyThread继承于Thread,实现连接远程主机端口,并对特定端口进行处理。
classMyThreadextendsThread
{
privateintthreadnum;
publicstaticInetAddresshostname;
publicstaticintminPort;
publicstaticintmaxPort;
publicMyThread(Stringname,intthreadnum)
{
super(name);
this.threadnum=threadnum;
}
publicvoidrun()
{
inti;
Socketsock;
for(i=minPort+threadnum;i{
ThreadScan.status.setText("扫描状态:
正在扫描"+i+"端口");
try
{
sock=newSocket(hostname,i);
sock.close();
ThreadScan.message.append(""+i);
switch(i)
{
case21:
ThreadScan.message.append("(FTP)");
break;
case23:
ThreadScan.message.append("(TELNET)");
break;
case25:
ThreadScan.message.append("(SMTP)");
break;
case80:
ThreadScan.message.append("(HTTP)");
break;
case110:
ThreadScan.message.append("(POP)");
break;
}
ThreadScan.message.append(",");
}
catch(IOExceptione)
{}
}
if(i==maxPort)
{
ThreadScan.message.append("\n"+"扫描完成...");
ThreadScan.status.setText("扫描状态:
完成!
");
}
}
}
类okAction用于点击“确定”按钮后对输入信息进行判断,是否符合输入条件,若不符合条件,则抛出错误信息,并实现新线程的创建。
classokActionimplementsActionListener
{
publicvoidactionPerformed(ActionEventa)
{
intminPort;
intmaxPort;
intmaxThread;
try
{
minPort=Integer.parseInt(ThreadScan.t2.getText());
maxPort=Integer.parseInt(ThreadScan.t3.getText());
maxThread=Integer.parseInt(ThreadScan.t4.getText());
}
catch(NumberFormatExceptione)
{
ThreadScan.infoDialog.setText("错误的端口号或线程数!
端口号和线程数必须为整数!
");
ThreadScan.errorDialog.setVisible(true);
ThreadScan.status.setText("扫描状态:
未开始");
return;
}
try
{
MyThread.hostname=InetAddress.getByName(ThreadScan.t1.getText());
}
catch(UnknownHostExceptione)
{
ThreadScan.infoDialog.setText("错误的IP地址/域名或地址不可达!
");
ThreadScan.errorDialog.setVisible(true);
ThreadScan.status.setText("扫描状态:
未开始");
return;
}
if(minPort<0||minPort>65535||minPort>maxPort)
{
ThreadScan.infoDialog.setText("最小端口必须是0-65535并且小于最大端口的整数!
");
ThreadScan.errorDialog.setVisible(true);
return;
}
elseMyThread.minPort=minPort;
if(maxPort<0||maxPort>65535||maxPort{
ThreadScan.infoDialog.setText("最大端口必须是0-65535并且大于最小端口的整数!
");
ThreadScan.errorDialog.setVisible(true);
ThreadScan.status.setText("扫描状态:
未开始");
return;
}
elseMyThread.maxPort=maxPort;
if(maxThread<1||maxThread>1000)
{
ThreadScan.infoDialog.setText("线程数为1-1000的整数!
");
ThreadScan.errorDialog.setVisible(true);
ThreadScan.status.setText("扫描状态:
未开始");
return;
}
ThreadScan.message.setText("");
ThreadScan.message.append("正在扫描"+ThreadScan.t1.getText()+"线程数"+ThreadScan.t4.getText()+"\n");
ThreadScan.message.append("开放端口:
");
for(inti=0;i{
newMyThread("T"+i,i).start();
}
}
}
四、存在问题和改进意见
在面板布局上,原来使用的是GridBagLayout,但是占击“确定”后,面板会变形。
后改用用FlowLayout,处理得不好,不能灵活布置各组件的位置。
在处理完成后,扫描状态栏程序中设置有显示“扫描状态:
完成!
”,但实际运行并不能显示出来。
这个问题未能解决。
在对输入信息进行处理后,要将处理信息显示在message文本框中时,遇到了问题,信息并不能显示在文本框中,原来用setText()和append()方法就可以完成,但我只使用了append()方法,以致于始终不能显示。
原因在于,在使用append()方法时,必须是对已有String进行操作,即要先使用setText(),给文本框赋一个String值,才能进行append()。
改进意见:
本程序只能对局域网内的主机进行扫描,如果能外网主机进行扫描,那功能更为完善。
这要涉及到子网掩码和对IP及子网掩码进行处理。
参考文献
[1].张席,戴劲.Java语言程序设计教程.西安:
西安电子科技大学出版社.
[2].BruceEcket著,侯捷译.Java编程思想(第2版).北京:
机械工业出版社.
[3].精通java-swing程序设计.chm.
[4].JavaTM2PlatformStandardEdition5.0API规范.