端口扫描程序设计(详细的报告+源代码)_第1页
端口扫描程序设计(详细的报告+源代码)_第2页
端口扫描程序设计(详细的报告+源代码)_第3页
端口扫描程序设计(详细的报告+源代码)_第4页
端口扫描程序设计(详细的报告+源代码)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、网络综合实验任务书一、 目的与要求1性质:设计性实验。2 任务:设计并实现一个端口扫描程序, 检测某个 ip 或某段 ip 的计算机的端口工作情况。3 目的:加深对课堂讲授知识的理解, 熟练掌握基本的网络编程技术和方法, 建立网络编程整体概念,使得学生初步具有研究、设计、编制和调试网络程序的能力。4 要求:熟悉有关定义、概念和实现算法, 设计出程序流程框图和数据结构, 编写出完整的源程序,基本功能完善,方便易用,操作无误。5学生要求人数:1 人。二、 主要内容1编写一个端口扫描程序,能够显示某个ip 或某段 ip 的计算机的某一个或某些端口是否正在工作。基本工作过程如下:(1) 设定好一定的端

2、口扫描范围;(2) 设定每个端口扫描的次数,因为有可能有的端口一次扫描可能不通;(3) 创建 socket ,通过 socket 的 connect 方法来连接远程 ip 地址以及对应的端口;(4) 如果返回 false ,表示端口没有开放,否则端口开放。三、进度计划序号设计内容完成时间备注1任务布置及资料收集第 1周周一、周二2软件方案设计与制定第 1周周三至周四3编程实现第 1 周周周五至第2 周周二4程序测试与修改,撰写报告第 2 周周三至周五上午5报告提交,软件验收周五下午四、设计成果要求1完成规定的实验任务,保质保量;2完成综合实验报告,要求格式规范, 内容具体而翔实,应体现自身所做

3、的工作,注重对实验思路的归纳和对问题解决过程的总结。五、 考核方式1平时成绩验收答辩实验报告;2五级分制。学生姓名:指导教师:2009年 6 月 8 日一、综合实验的目的与要求1目的:加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,加深对java编程语言的使用,促进编程能力的提高,同时为网络编程打下一个比较好的基础。同时对实验的过程要有完全的了解。2. 要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,基本功能完善,方便易用,操作无误。二、综合实验正文1编程语言的选择针对编写的是端口扫描的程序,所以我选择了java 编程,因

4、为要简单而方便的试验端口扫描的功能。2端口扫描实现的功能是:显示某个ip 或某段 ip 的计算机的某一个或某些端口是否正在工作2 1 如何选择ip 段和端口创建 socket ,通过 socket 的 connect 方法来连接远程ip 地址以及对应的端口。而我使用的是 socket函数来实现端口的扫描和ip 地址的选择扫描。2 2 如何实现快速扫描端口通过实现多线程,当一个ip 或者一个端口同时分配多个线程进行扫描,速度会比单线程扫描快许多。2 3 显示扫描结果可以在使用java编写的时候,可以通过使用jscrollpane控件实现显示结果。2 4 实现要求功能之余美化外观3创建应用程序界面

5、3 1 建立主窗体,“ java端口扫描器”图 1-13 2 ip地址的输入部分图 1-23 3 端口部分,其中包括指定的端口和指定扫描的端口范围图 1-33 4 多线程的实现和延时的控制部分图 1-43 5 增加的保存及快捷键功能图 1-54 扫描的整个过程4 1 填写 ip 地址 00 204 2 填写端口扫描的范围为1 3004 3 线程数选择为1004 4 扫描结果如下图 1-6三端口扫描的主要部分程序如下import .*;import java.io.*;import java.awt.*;import java.awt.

6、event.*;import javax.swing.*;/* 实现扫描的主体程序*/public class threadscanpublic static jframe main=new jframe(java端口扫描器 );/ 显示扫描结果public static jtextarea result=new jtextarea(,4,40);/ 滚动条面板publicstaticjscrollpaneresultpane=newjscrollpane(result,jscrollpane.vertical_scrollbar_as_needed, jscrollpane.horizont

7、al_scrollbar_as_needed;/ 输入主机名文本框public static jtextfield hostname=new jtextfield(localhost,8);/ 输入 ip 地址前 3 位的输入框public static jtextfield fromip1=new jtextfield(0,3);/ 输入 ip 地址 46 位的输入框public static jtextfield fromip2=new jtextfield(0,3);/ 输入 ip 地址 79 位的输入框public static jtextfield fromip3=new jtext

8、field(0,3);/ 输入起始 ip 地址最后 4 位的输入框public static jtextfield fromip4=new jtextfield(0,3);/ 输入目标 ip 地址最后 4 位的输入框public static jtextfield toip=new jtextfield(0,3);/ 输入最小端口的输入框public static jtextfield minport=new jtextfield(0,4);/ 输入最大端口的输入框public static jtextfield maxport=new jtextfield(1000,4);/ 输入最大线程数

9、量的输入框public static jtextfield maxthread=new jtextfield(100,3);/ 错误提示框public static jdialog dlgerror=new jdialog(main,错误 !);public static jlabel dlginfo=new jlabel();public static jlabel type=new jlabel(请选择: );/ 扫描类型public static jradiobutton radioip = new jradiobutton(ip地址: );public static jradiobut

10、ton radiohost= new jradiobutton( 主机名: ,true);/ 单选框组public static buttongroup group = new buttongroup();public static jlabel p1=new jlabel(端口范围 :);public static jlabel p2=new jlabel();public static jlabel p3=new jlabel();public static jlabel pdot1 = new jlabel(.);public static jlabel pdot2 = new jlab

11、el(.);public static jlabel pdot3 = new jlabel(.);public static jlabel tnum=new jlabel(线程数 :);public static jlabel rst=new jlabel(扫描结果 :);public static jlabel con=new jlabel();/ 定义按钮public static jbutton ok = new jbutton(确定 );public static jbutton submit = new jbutton(开始扫描 );public static jbutton can

12、cel = new jbutton(退出 );public static jbutton savebutton = new jbutton(保存扫描结果 );/ 菜单栏public static jmenubar mybar = new jmenubar();public static jmenu mymenu = new jmenu(文件 (f);public static jmenuitem saveitem = new jmenuitem(保存扫描结果 (s);public static jmenuitem exititem = new jmenuitem(退出 (q);public s

13、tatic void main(string args)main.setsize(500,400);main.setlocation(300,300);main.setresizable(false);main.setlayout(new gridbaglayout();main.setdefaultcloseoperation(jframe.exit_on_close);dlgerror.setsize(300,100);dlgerror.setlocation(400,400);/ 添加“菜单栏”mymenu.add(saveitem);mymenu.add(exititem);mybar

14、.add(mymenu);main.setjmenubar(mybar);/ 设置热键mymenu.setmnemonic(f);saveitem.setmnemonic (s);/ 为“另存为”组件设置快捷键为ctrl+ssaveitem.setaccelerator(keystroke.getkeystroke(keyevent.vk_s,inputevent .ctrl_mask);exititem.setmnemonic(q);exititem.setaccelerator(keystroke.getkeystroke(keyevent.vk_e,inputevent .ctrl_ma

15、sk);/ 采用表格包型布局container mpanel = main.getcontentpane();gridbagconstraints c = new gridbagconstraints();c.insets = new insets(10,0,0,10);c.gridx = 0;c.gridy = 0;c.gridwidth = 10;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(type,c);group.add(radioip);group.add(radio

16、host);c.gridx = 0;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(radioip,c);c.gridx = 1;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(fromip1,c);c.gridx = 2;c.gridy = 1;c.grid

17、width = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(pdot1,c);c.gridx = 3;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(fromip2,c);c.gridx = 4;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.

18、both;c.anchor = gridbagconstraints.center;mpanel.add(pdot2,c);c.gridx = 5;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(fromip3,c);c.gridx = 6;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.cen

19、ter;mpanel.add(pdot3,c);c.gridx = 7;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(fromip4,c);c.gridx = 8;c.gridy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(p2,c);c.gridx = 9;c.gri

20、dy = 1;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(toip,c);c.gridx = 0;c.gridy = 2;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(radiohost,c);c.gridx = 1;c.gridy = 2;c.gridwidth = 3;c.fill = gridb

21、agconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(hostname,c);c.gridx = 0;c.gridy = 3;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(p1,c);c.gridx = 1;c.gridy = 3;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagcon

22、straints.center;mpanel.add(minport,c);c.gridx = 2;c.gridy = 3;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(p3,c);c.gridx = 3;c.gridy = 3;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(maxport,c);c.g

23、ridx = 0;c.gridy = 4;c.gridwidth = 1;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(tnum,c);c.gridx = 1;c.gridy = 4;c.gridwidth = 3;c.fill = gridbagconstraints.both;c.anchor = gridbagconstraints.center;mpanel.add(maxthread,c);c.gridx = 0;c.gridy = 5;c.gridwidth = 3;

24、c.fill = gridbagconstraints.vertical;c.anchor = gridbagconstraints.center;mpanel.add(submit,c);c.gridx = 6;c.gridy = 5;c.gridwidth = 4;c.fill = gridbagconstraints.vertical;c.anchor = gridbagconstraints.center;mpanel.add(cancel,c);c.gridx = 0;c.gridy = 6;c.gridwidth = 10;c.fill = gridbagconstraints.b

25、oth;c.anchor = gridbagconstraints.center;mpanel.add(rst,c);/ 设置文本区域可以换行result.setlinewrap(true);/ 设置文本区域不可编辑result.seteditable(false);c.gridx = 0;c.gridy = 7;c.gridwidth = 10;c.gridheight = 4;c.fill = gridbagconstraints.vertical;c.anchor = gridbagconstraints.center;mpanel.add(resultpane,c);container

26、 dpanel = dlgerror.getcontentpane();dpanel.setlayout(new flowlayout(flowlayout.center);dpanel.add(dlginfo);dpanel.add(ok);submit.addactionlistener(new submitaction();cancel.addactionlistener(new cancleaction();ok.addactionlistener(new okaction();/ 实现退出功能exititem.addactionlistener(new java.awt.event.

27、actionlistener() public void actionperformed(java.awt.event.actionevent e) system.exit(0););/ 实现帮助功能savebutton.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(java.awt.event.actionevent e) jfilechooser fc=new jfilechooser();int returnval=fc.showsavedialog(null);/ 点击

28、“保存” if(returnval = 0)file savefile=fc.getselectedfile();try filewriter writeout = new filewriter(savefile);writeout.write(threadscan.result.gettext();writeout.close();catch (ioexception ex) system.out.println(保存失败 );/ 点击“取消”elsereturn;);main.setvisible(true);/* 实现“取消”功能* 退出程序*/class cancleaction im

29、plements actionlistenerpublic void actionperformed (actionevent e)system.exit(0);/* 实现“确定”功能* 完成扫描*/class submitaction implements actionlistenerpublic void actionperformed (actionevent a)int minport;int maxport;int maxthread;int ip1 = 0;int ip2 = 0;int ip3 = 0;int ipstart = 0;int ipend = 0;string ip

30、address = ;string hostname = ;threadscan.result.settext();/ 将 确定 按钮设置成为不可用if(threadscan.submit.isenabled()threadscan.submit.setenabled(false);/* 判断搜索的类型* 按照 ip 地址扫描: type = 0* 按照主机名称扫描: type = 1*/if(threadscan.radioip.isselected()tcpthread.type = 0;/ 判断 ip 的前 3 位是否为 int 型tryip1=integer.parseint(thre

31、adscan.fromip1.gettext();catch(numberformatexception e)threadscan.dlginfo.settext(错误的 ip!);threadscan.dlgerror.setvisible(true);return;/ 判断 ip 的 46 位是否为 int 型 tryip2=integer.parseint(threadscan.fromip2.gettext();catch(numberformatexception e)threadscan.dlginfo.settext(错误的 ip!);threadscan.dlgerror.se

32、tvisible(true);return;/ 判断 ip 的 79 位是否为 int 型 tryip3=integer.parseint(threadscan.fromip3.gettext();catch(numberformatexception e)threadscan.dlginfo.settext(错误的 ip!);threadscan.dlgerror.setvisible(true);return;/ 判断起始 ip 的最后 4 位是否为 int 型tryipstart=integer.parseint(threadscan.fromip4.gettext();catch(nu

33、mberformatexception e)threadscan.dlginfo.settext(错误的 ip!);threadscan.dlgerror.setvisible(true);return;/ 判断目标 ip 的最后 4 位是否为 int 型 tryipend=integer.parseint(threadscan.toip.gettext();catch(numberformatexception e) threadscan.dlginfo.settext( 错误的目标 ip!); threadscan.dlgerror.setvisible(true);return;/ 判断

34、起始 ip 是否正确/ 判断条件:大于 0 且小于等于 255if(ip1255|ip2255|ip3255|ipstart255)threadscan.dlginfo.settext( ip地址为0-255的整数! );threadscan.dlgerror.setvisible(true);return;elsetcpthread.ip1 = ip1;tcpthread.ip2 = ip2;tcpthread.ip3 = ip3;tcpthread.ipstart = ipstart;/ 判断目标 ip 是否正确/ 判断条件:大于 0 且小于等于 255if(ipend255)thread

35、scan.dlginfo.settext( 目标 ip 地址为 0-255 的整数 ! ); threadscan.dlgerror.setvisible(true); return;elsetcpthread.ipend = ipend;ipaddress = + ip1 + ip2 + ip3 + ipstart;/* 判断 ip 地址的有效性*/trytcpthread.hostaddress=inetaddress.getbyname(ipaddress);catch(unknownhostexception e)threadscan.dlginfo.settext(错误的 ip 或地

36、址不可达 ! );threadscan.dlgerror.setvisible(true);return;/ 根据主机名进行端口扫描 if(threadscan.radiohost.isselected()tcpthread.type = 1;/* 判断主机名称的有效性*/trytcpthread.hostaddress=inetaddress.getbyname(threadscan.hostname.gettext();catch(unknownhostexception e)threadscan.dlginfo.settext(错误的域名或地址不可达! );threadscan.dlge

37、rror.setvisible(true);return;/* 判断端口号的有效性*/tryminport=integer.parseint(threadscan.minport.gettext(); maxport=integer.parseint(threadscan.maxport.gettext(); maxthread=integer.parseint(threadscan.maxthread.gettext();catch(numberformatexception e)threadscan.dlginfo.settext(错误的端口号或线程数! 端口号和线程数必须为整数 !);t

38、hreadscan.dlgerror.setvisible(true);return;/* 判断最小端口号的有效范围* 判断条件:大于 0 且小于 65535,最大端口应大于最小端口*/if(minport65535 | minportmaxport)threadscan.dlginfo.settext(最小端口必须是0-65535并且小于最大端口的整数 !);threadscan.dlgerror.setvisible(true);return;elsetcpthread.min_port=minport;/* 判断最大端口号的有效范围* 判断条件:大于 0 且小于 65535,最大端口应大

39、于最小端口*/if(maxport65535 | maxportminport)threadscan.dlginfo.settext(最大端口必须是0-65535并且大于最小端口的整数 !);threadscan.dlgerror.setvisible(true);return;elsetcpthread.max_port=maxport;/* 判断线程数量的有效范围* 判断条件:大于 1 且小于 200*/if(maxthread200) threadscan.dlginfo.settext( 线程数为 1-200 的整数 ! ); threadscan.dlgerror.setvisibl

40、e(true);return;threadscan.result.append( 线 程 数 +threadscan.maxthread.gettext()+n);/ 启动线程for(int i=0;imaxthread;i+)new tcpthread(t + i,i).start();/* 实现错误提示框中的“确定”按钮功能*/class okaction implements actionlistenerpublic void actionperformed (actionevent e)threadscan.dlgerror.dispose();多线程类文件:import java.n

41、et.*;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class tcpthread extends threadpublic static inetaddress hostaddress;/ 最小的端口号public static int min_port;/ 最大的端口号public static int max_port;/ 线程总数private int threadnum;/ 查询方式: 0 为 ip ; 1 为主机名public static int t

42、ype;/ip地址前 3 位public static int ip1;/ip地址 46 位public static int ip2;/ip地址 79 位public static int ip3;/ 起始 ip 地址的最后 4 位 public static int ipstart;/ 结束 ip 地址的最后 4 位 public static int ipend;/ 完整的 ip 地址public static string ipall;/ 扫描的主机名称或 ip string hostname = ;/ 端口的类别string porttype = 0;/* 构造函数*/public

43、tcpthread(string name,int threadnum)super(name);this.threadnum = threadnum;/* 运行函数*/public void run() /ip地址int h = 0;/ 端口号int i = 0;socket thetcpsocket;/ 根据 ip 地址进行扫描if(type = 0)/ip地址循环扫描for(h = ipstart; h =ipend; h+)/ 组成完整的 ip 地址ipall = + ip1 + . + ip2 + . + ip3 + . + h;hostname = ipall;try/ 在给定主机名

44、的情况下确定主机的 ip hostaddress=inetaddress.getbyname(ipall);地址catch(unknownhostexception e)/ 不同的端口循环扫描for(i=min_port+threadnum;imax_port+integer.parseint(threadscan.maxthread.gettext();i+=integer.parseint(threadscan.maxthread.gettext()trythetcpsocket=new socket(hostaddress,i);thetcpsocket.close();threadsc

45、an.result.append(hostname+:+i);/ 判断端口的类别switch(i)case 21:porttype = (ftp);break;case 23:porttype = (telnet);break;case 25:porttype = (smtp);break;case 80:porttype = (http);break;case 110:porttype = (pop);break;case 139:porttype = (netbios);break;case 1433:porttype = (sql server);break;case 3389:porttype = (terminal se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论