端口掃描程序的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
端口掃描程序的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
端口掃描程序的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
端口掃描程序的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
端口掃描程序的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、網(wǎng)絡(luò)綜合實(shí)驗(yàn)任 務(wù) 書一、 目的與要求1 性質(zhì):設(shè)計(jì)性實(shí)驗(yàn)。2 任務(wù):設(shè)計(jì)并實(shí)現(xiàn)一個端口掃描程序,檢測某個ip或某段ip的計(jì)算機(jī)的端口工作情況。3 目的:加深對課堂講授知識的理解,熟練掌握基本的網(wǎng)絡(luò)編程技術(shù)和方法,建立網(wǎng)絡(luò)編程整體概念,使得學(xué)生初步具有研究、設(shè)計(jì)、編制和調(diào)試網(wǎng)絡(luò)程序的能力。4 要求:熟悉有關(guān)定義、概念和實(shí)現(xiàn)算法,設(shè)計(jì)出程序流程框圖和數(shù)據(jù)結(jié)構(gòu),編寫出完整的源程序,基本功能完善,方便易用,操作無誤。5 學(xué)生要求人數(shù):1人。二、 主要內(nèi)容1 編寫一個端口掃描程序,能夠顯示某個ip或某段ip的計(jì)算機(jī)的某一個或某些端口是否正在工作?;竟ぷ鬟^程如下:(1) 設(shè)定好一定的端口掃描范圍;(2

2、) 設(shè)定每個端口掃描的次數(shù),因?yàn)橛锌赡苡械亩丝谝淮螔呙杩赡懿煌ǎ?3) 創(chuàng)建socket,通過socket的connect方法來連接遠(yuǎn)程ip地址以及對應(yīng)的端口;(4) 如果返回false,表示端口沒有開放,否則端口開放。三、 進(jìn)度計(jì)劃序號設(shè)計(jì)內(nèi)容完成時間備注1任務(wù)布置及資料收集第1周周一、周二2軟件方案設(shè)計(jì)與制定第1周周三至周四3編程實(shí)現(xiàn)第1周周周五至第2周周二4程序測試與修改,撰寫報(bào)告第2周周三至周五上午5報(bào)告提交,軟件驗(yàn)收周五下午四、設(shè)計(jì)成果要求1 完成規(guī)定的實(shí)驗(yàn)任務(wù),保質(zhì)保量;2 完成綜合實(shí)驗(yàn)報(bào)告,要求格式規(guī)范,內(nèi)容具體而翔實(shí),應(yīng)體現(xiàn)自身所做的工作,注重對實(shí)驗(yàn)思路的歸納和對問題解決過程的

3、總結(jié)。五、 考核方式1 平時成績驗(yàn)收答辯實(shí)驗(yàn)報(bào)告;2 五級分制。 學(xué)生姓名: 指導(dǎo)教師: 2009 年 6月8 日一、綜合實(shí)驗(yàn)的目的與要求1目的:加深對課堂講授知識的理解,熟練掌握基本的網(wǎng)絡(luò)編程技術(shù)和方法,建立網(wǎng)絡(luò)編程整體概念,加深對java編程語言的使用,促進(jìn)編程能力的提高,同時為網(wǎng)絡(luò)編程打下一個比較好的基礎(chǔ)。同時對實(shí)驗(yàn)的過程要有完全的了解。2. 要求:熟悉有關(guān)定義、概念和實(shí)現(xiàn)算法,設(shè)計(jì)出程序流程框圖和數(shù)據(jù)結(jié)構(gòu),編寫出完整的源程序,基本功能完善,方便易用,操作無誤。二、綜合實(shí)驗(yàn)正文1編程語言的選擇針對編寫的是端口掃描的程序,所以我選擇了java編程,因?yàn)橐唵味奖愕脑囼?yàn)端口掃描的功能。2端

4、口掃描實(shí)現(xiàn)的功能是:顯示某個ip或某段ip的計(jì)算機(jī)的某一個或某些端口是否正在工作21 如何選擇ip段和端口創(chuàng)建socket,通過socket的connect方法來連接遠(yuǎn)程ip地址以及對應(yīng)的端口。而我使用的是socket函數(shù)來實(shí)現(xiàn)端口的掃描和ip地址的選擇掃描。22 如何實(shí)現(xiàn)快速掃描端口通過實(shí)現(xiàn)多線程,當(dāng)一個ip或者一個端口同時分配多個線程進(jìn)行掃描,速度會比單線程掃描快許多。23 顯示掃描結(jié)果可以在使用java編寫的時候,可以通過使用jscrollpane控件實(shí)現(xiàn)顯示結(jié)果。24 實(shí)現(xiàn)要求功能之余美化外觀3創(chuàng)建應(yīng)用程序界面31 建立主窗體 ,“java端口掃描器”圖1-132 ip地址的輸入部分圖

5、1-2 33 端口部分,其中包括指定的端口和指定掃描的端口范圍圖1-334 多線程的實(shí)現(xiàn)和延時的控制部分圖1-435 增加的保存及快捷鍵功能圖1-5 4掃描的整個過程41 填寫ip地址 002042 填寫端口掃描的范圍為130043 線程數(shù)選擇為10044 掃描結(jié)果如下圖1-6 5端口掃描的主要部分程序如下import .*;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;/* *實(shí)現(xiàn)掃描的主體程序 */public class threa

6、dscanpublic static jframe main=new jframe("java端口掃描器");/顯示掃描結(jié)果public static jtextarea result=new jtextarea("",4,40);/滾動條面板 public static jscroll paneresultpane = newjscrollpane(result,jscrollpane.vertical_scrollbar_as_needed, jscrollpane.horizontal_scrollbar_as_needed;/輸入主機(jī)名文本框pu

7、blic 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 jtextfield("0&

8、quot;,3);/輸入起始ip地址最后4位的輸入框public static jtextfield fromip4=new jtextfield("0",3);/輸入目標(biāo)ip地址最后4位的輸入框public static jtextfield toip=new jtextfield("0",3);/輸入最小端口的輸入框public static jtextfield minport=new jtextfield("0",4);/輸入最大端口的輸入框public static jtextfield maxport=new jtextf

9、ield("1000",4);/輸入最大線程數(shù)量的輸入框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 s

10、tatic jradiobutton radioip = new jradiobutton("ip地址:");public static jradiobutton radiohost = new jradiobutton("主機(jī)名:",true);/單選框組public static buttongroup group = new buttongroup();public static jlabel p1=new jlabel("端口范圍:");public static jlabel p2=new jlabel("&quo

11、t;);public static jlabel p3=new jlabel("");public static jlabel pdot1 = new jlabel(".");public static jlabel pdot2 = new jlabel(".");public static jlabel pdot3 = new jlabel(".");public static jlabel tnum=new jlabel("線程數(shù):");public static jlabel rst=ne

12、w jlabel("掃描結(jié)果: ");public static jlabel con=new jlabel(" ");/定義按鈕public static jbutton ok = new jbutton("確定");public static jbutton submit = new jbutton("開始掃描");public static jbutton cancel = new jbutton("退出");public static jbutton savebutton = new j

13、button("保存掃描結(jié)果");/菜單欄public static jmenubar mybar = new jmenubar();public static jmenu mymenu = new jmenu("文件(f)");public static jmenuitem saveitem = new jmenuitem("保存掃描結(jié)果(s)");public static jmenuitem exititem = new jmenuitem("退出(q)");public static void main(s

14、tring 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.add(mymenu);main.

15、setjmenubar(mybar);/設(shè)置熱鍵mymenu.setmnemonic('f'); saveitem.setmnemonic ('s'); /為“另存為”組件設(shè)置快捷鍵為ctrl+s saveitem.setaccelerator(keystroke.getkeystroke(keyevent.vk_s,inputevent.ctrl_mask); exititem.setmnemonic('q'); exititem.setaccelerator(keystroke.getkeystroke(keyevent.vk_e,input

16、event.ctrl_mask); /采用表格包型布局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);gr

17、oup.add(radiohost);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.gri

18、dy = 1;c.gridwidth = 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 = gridba

19、gconstraints.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 = gridbagco

20、nstraints.center;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.gr

21、idx = 9;c.gridy = 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

22、.fill = gridbagconstraints.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

23、 = gridbagconstraints.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(m

24、axport,c);c.gridx = 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.g

25、ridwidth = 3;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 = gridbag

26、constraints.both;c.anchor = gridbagconstraints.center;mpanel.add(rst,c);/設(shè)置文本區(qū)域可以換行result.setlinewrap(true);/設(shè)置文本區(qū)域不可編輯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

27、);container 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();/實(shí)現(xiàn)退出功能exititem.addactionlistener(new java.

28、awt.event.actionlistener() public void actionperformed(java.awt.event.actionevent e) system.exit(0););/實(shí)現(xiàn)幫助功能savebutton.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(java.awt.event.actionevent e) jfilechooser fc=new jfilechooser();int returnval=fc.showsavedialog(n

29、ull);/點(diǎn)擊“保存”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("保存失敗");/點(diǎn)擊“取消”elsereturn;);main.setvisible(true);/* *實(shí)現(xiàn)“取消”功能 *退出程序 */cl

30、ass cancleaction implements actionlistenerpublic void actionperformed (actionevent e)system.exit(0);/* *實(shí)現(xiàn)“確定”功能 *完成掃描 */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;in

31、t ipend = 0;string ipaddress = ""string hostname = ""threadscan.result.settext("");/將"確定"按鈕設(shè)置成為不可用if(threadscan.submit.isenabled()threadscan.submit.setenabled(false);/* *判斷搜索的類型 *按照ip地址掃描:type = 0 *按照主機(jī)名稱掃描:type = 1 */if(threadscan.radioip.isselected()tcpthrea

32、d.type = 0;/判斷ip的前3位是否為int型tryip1=integer.parseint(threadscan.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)

33、threadscan.dlginfo.settext("錯誤的ip!");threadscan.dlgerror.setvisible(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型

34、tryipstart=integer.parseint(threadscan.fromip4.gettext();catch(numberformatexception e)threadscan.dlginfo.settext("錯誤的ip!");threadscan.dlgerror.setvisible(true);return;/判斷目標(biāo)ip的最后4位是否為int型tryipend=integer.parseint(threadscan.toip.gettext();catch(numberformatexception e)threadscan.dlginfo.se

35、ttext("錯誤的目標(biāo)ip!");threadscan.dlgerror.setvisible(true);return;/判斷起始ip是否正確/判斷條件:大于0且小于等于255if(ip1<0 | ip1>255|ip2<0 | ip2>255|ip3<0 | ip3>255|ipstart<0 | ipstart>255)threadscan.dlginfo.settext(" ip地址為0-255的整數(shù)! ");threadscan.dlgerror.setvisible(true);return;

36、elsetcpthread.ip1 = ip1;tcpthread.ip2 = ip2;tcpthread.ip3 = ip3;tcpthread.ipstart = ipstart;/判斷目標(biāo)ip是否正確/判斷條件:大于0且小于等于255if(ipend<0 | ipend>255)threadscan.dlginfo.settext("目標(biāo)ip地址為0-255的整數(shù)! ");threadscan.dlgerror.setvisible(true);return;elsetcpthread.ipend = ipend;ipaddress = "&qu

37、ot; + ip1 + ip2 + ip3 + ipstart;/* *判斷ip地址的有效性 */trytcpthread.hostaddress=inetaddress.getbyname(ipaddress);catch(unknownhostexception e)threadscan.dlginfo.settext(" 錯誤的ip或地址不可達(dá)! ");threadscan.dlgerror.setvisible(true);return;/根據(jù)主機(jī)名進(jìn)行端口掃描if(threadscan.radiohost.isselected()tcpthread.type =

38、1;/* *判斷主機(jī)名稱的有效性 */trytcpthread.hostaddress=inetaddress.getbyname(threadscan.hostname.gettext();catch(unknownhostexception e)threadscan.dlginfo.settext("錯誤的域名或地址不可達(dá)! ");threadscan.dlgerror.setvisible(true);return;/* *判斷端口號的有效性 */tryminport=integer.parseint(threadscan.minport.gettext();maxp

39、ort=integer.parseint(threadscan.maxport.gettext();maxthread=integer.parseint(threadscan.maxthread.gettext();catch(numberformatexception e)threadscan.dlginfo.settext("錯誤的端口號或線程數(shù)!端口號和線程數(shù)必須為整數(shù)!");threadscan.dlgerror.setvisible(true);return;/* *判斷最小端口號的有效范圍 *判斷條件:大于0且小于65535,最大端口應(yīng)大于最小端口 */if(m

40、inport<0 | minport>65535 | minport>maxport)threadscan.dlginfo.settext("最小端口必須是0-65535并且小于最大端口的整數(shù)!");threadscan.dlgerror.setvisible(true);return;elsetcpthread.min_port=minport;/* *判斷最大端口號的有效范圍 *判斷條件:大于0且小于65535,最大端口應(yīng)大于最小端口 */if(maxport<0 | maxport>65535 | maxport<minport)t

41、hreadscan.dlginfo.settext("最大端口必須是0-65535并且大于最小端口的整數(shù)!");threadscan.dlgerror.setvisible(true);return;elsetcpthread.max_port=maxport;/* *判斷線程數(shù)量的有效范圍 *判斷條件:大于1且小于200 */if(maxthread<1 | maxthread>200)threadscan.dlginfo.settext("線程數(shù)為1-200的整數(shù)! ");threadscan.dlgerror.setvisible(tr

42、ue);return;threadscan.result.append("線程數(shù) "+threadscan.maxthread.gettext()+"n");/啟動線程for(int i=0;i<maxthread;i+)new tcpthread("t" + i,i).start();/* *實(shí)現(xiàn)錯誤提示框中的“確定”按鈕功能 */class okaction implements actionlistenerpublic void actionperformed (actionevent e)threadscan.dlger

43、ror.dispose();多線程類文件:import .*;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;/線程總數(shù)private int threadnum; /查詢方式:0為ip;1為主機(jī)名pu

44、blic static int type;/ip地址前3位public static int ip1;/ip地址46位public static int ip2;/ip地址79位public static int ip3;/起始ip地址的最后4位public static int ipstart;/結(jié)束ip地址的最后4位public static int ipend;/完整的ip地址public static string ipall;/掃描的主機(jī)名稱或ipstring hostname = ""/端口的類別string porttype = "0"/*

45、 *構(gòu)造函數(shù) */public tcpthread(string name,int threadnum)super(name); this.threadnum = threadnum; /* *運(yùn)行函數(shù) */public void run() /ip地址int h = 0;/端口號int i = 0;socket thetcpsocket;/根據(jù)ip地址進(jìn)行掃描if(type = 0)/ip地址循環(huán)掃描for(h = ipstart; h <=ipend; h+)/組成完整的ip地址ipall = "" + ip1 + "." + ip2 + &q

46、uot;." + ip3 + "." + h;hostname = ipall;try/在給定主機(jī)名的情況下確定主機(jī)的 ip 地址hostaddress=inetaddress.getbyname(ipall);catch(unknownhostexception e)/不同的端口循環(huán)掃描for (i = min_port+threadnum; i < max_port + integer.parseint(threadscan.maxthread.gettext(); i += integer.parseint(threadscan.maxthread.g

47、ettext()trythetcpsocket=new socket(hostaddress,i);thetcpsocket.close();threadscan.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

48、)"break;case 110:porttype = "(pop)"break;case 139:porttype = "(netbios)"break;case 1433:porttype = "(sql server)"break;case 3389:porttype = "(terminal service)"break;case 443:porttype = "(https)"break;case 1521:porttype = "(oracle)"break;/端口沒有特定類別if(porttype.equals("0")threadscan.result.append("n");elsethreadscan.result.append(":"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論