Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡(jiǎn)單端口掃描器示例
本文實(shí)例講述了Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡(jiǎn)單端口掃描器。分享給大家供大家參考,具體如下:
在計(jì)算機(jī)網(wǎng)絡(luò)的學(xué)習(xí)中,不由得覺得這門課的零碎知識(shí)點(diǎn)異常之多,同時(shí)因?yàn)閷W(xué)習(xí)的課本是老外的教材——自頂向下方法,因此學(xué)習(xí)起來(lái)不免覺得吃力,但是從老外的教材里更能從一定高度理解計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)體系,也是樂(lè)在其中,同時(shí)做英語(yǔ)的習(xí)題感覺也很有趣味,從各方面來(lái)說(shuō)可以說(shuō)是獲益良多,認(rèn)識(shí)了很多專業(yè)詞匯。節(jié)課之后,便想做一個(gè)簡(jiǎn)單的端口掃描器,用的語(yǔ)言是java,因?yàn)閷?shí)現(xiàn)界面很簡(jiǎn)單,同時(shí)也有封裝好的Socket類可以使用,主要思路如下:
在主程序界面里輸入指定主機(jī)名或ip地址,按下start按鈕,就可以掃描主機(jī)的常用端口是否打開。內(nèi)部設(shè)置了常用端口號(hào):21, 22, 23, 25, 26, 69, 80, 110, 143,443, 465, 995, 1080, 1158,1433, 1521, 2100, 3128, 3306, 3389,7001, 8080, 8081, 9080, 9090, 43958。也可以自行修改。程序?qū)崿F(xiàn)原理就是利用Java建立Socket去連接目標(biāo)ip的指定端口,如果能連接上就證明該端口開放。反之,若在超時(shí)之前都沒(méi)有連接上,則該端口是關(guān)閉的,同時(shí)會(huì)產(chǎn)生異常。同時(shí)考慮到單線程操作效率較低,也利用了Java可以多線程編程的特點(diǎn),使用了多線程掃描目標(biāo)主機(jī)的一個(gè)端口是否開放,因此最終顯示結(jié)果中端口的排列順序是隨機(jī)的,且內(nèi)部設(shè)定最多同時(shí)運(yùn)行10個(gè)線程(可以根據(jù)實(shí)際情況更改)。
主要運(yùn)用的網(wǎng)絡(luò)知識(shí)就是套接字的使用。以及java內(nèi)部的List容器,java的界面設(shè)計(jì),界面布局,以及簡(jiǎn)單的泛型編程的用法。
主要代碼如下:
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class ScanPort extends JFrame { /** * 端口掃描啟動(dòng)主程序 */ private static final long serialVersionUID = 1L; String str1 = " 常見端口有:"; String str2 = "ftp:21,22,telnet:23,smtp:25,http:80"; String str3 = "dns:53,tftp:69,snmp:161,162"; String str4 = "1158,1433,1521,2100,3128,26,69"; String str5 = "3306,3389,7001,8080,8081,110,143"; String str6 = "9080,9090,43958,443,465,995,1080"; JButton jb1 = new JButton("strat"); JTextArea jta = new JTextArea(); JScrollPane jsp = new JScrollPane(jta); JTextField jtf = new JTextField(17); String IP = "";//待掃描IP或域名 List <Integer>portList = new LinkedList<Integer>();// 定義一個(gè)List容器表示掃描的團(tuán)口的List集合 Integer[] ports = new Integer[] { 21, 22, 23, 25, 26, 53,69, 80, 110, 143, 443,465,69,161,162,135,995,1080,1158,1433,1521,2100, 3128, 3306, 3389, 7001, 8080, 8081, 9080, 9090, 43958 ,135,445,1025,1026,1027,1028,1055,5357}; // 常見端口集合 public ScanPort() { this.add(getPanel(), BorderLayout.SOUTH); jsp.setBorder(BorderFactory.createEtchedBorder()); jsp.setBackground(Color.cyan); this.add(jsp, BorderLayout.CENTER); this.add(getPanel2(), BorderLayout.NORTH); this.add(getPanel3(), BorderLayout.WEST); this.setBounds(300, 60, 600, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("ScanPort"); jta.setTabSize(4); jta.setFont(new Font("標(biāo)楷體", Font.BOLD, 16)); jta.setLineWrap(true);// 激活自動(dòng)換行功能 jta.setWrapStyleWord(true);// 激活斷行不斷字功能 portList.addAll(Arrays.asList(ports)); //將ports中的值加入到set中,并去掉重復(fù)的 jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub IP = jta.getText(); //ip為文本框內(nèi)輸入的字符串 scanPorts(IP, portList, 10, 800); //超時(shí)時(shí)間設(shè)定為800,線程數(shù)設(shè)定為10 } }); this.setVisible(true); } /** * 多線程掃描目標(biāo)主機(jī)指定List端口集合的開放情況 * * @param ip * 待掃描IP或域名 * @param portList * 待掃描的端口的List集合 * @param threadNumber * 線程數(shù) * @param timeout * 連接超時(shí)時(shí)間 * */ public void scanPorts(String ip, List<Integer> portSet,int threadNumber, int timeout) { ExecutorService threadPool = Executors.newCachedThreadPool(); //線程池 for (int i = 0; i < threadNumber; i++) { //10個(gè)線程 加入到線程池里 ScanMethod scanMethod2 = new ScanMethod(ip, portSet,threadNumber, i, timeout); threadPool.execute(scanMethod2); } threadPool.shutdown(); while (true) { if (threadPool.isTerminated()) { System.out.println("掃描結(jié)束"); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }// end of while } /* * 掃描方式:針對(duì)一個(gè)待掃描的端口的List集合進(jìn)行掃描 */ private class ScanMethod implements Runnable { private String ip; // 目標(biāo)IP private List<Integer> portList; // 待掃描的端口的List集合 private int threadNumber, serial, timeout; // 線程數(shù),這是第幾個(gè)線程,超時(shí)時(shí)間 public ScanMethod(String ip, List<Integer> portList, int threadNumber,int serial, int timeout) { this.ip = ip; this.portList = portList; this.threadNumber = threadNumber; this.serial = serial; this.timeout = timeout; } public void run() { int port = 0; Integer[] ports = portList.toArray(new Integer[portList.size()]); // List轉(zhuǎn)數(shù)組 try { InetAddress address = InetAddress.getByName(ip); //如果輸入的是主機(jī)名,嘗試獲取ip地址 Socket socket;//定義套接字 SocketAddress socketAddress;//傳遞ip和端口 if (ports.length < 1) //若數(shù)組沒(méi)有元素,返回,不執(zhí)行 return; for (port = 0 + serial; port <= ports.length - 1; port += threadNumber) { //每次運(yùn)行10個(gè)線程 socket = new Socket(); //為對(duì)象分配內(nèi)存空間 socketAddress = new InetSocketAddress(address, ports[port]); try { socket.connect(socketAddress, timeout); //對(duì)目標(biāo)主機(jī)的指定端口進(jìn)行連接,超時(shí)后連接失敗 socket.close(); //關(guān)閉端口 System.out.println("端口 " + ports[port] + " :開放"); jta.append("端口 " + ports[port] + " :開放\n"); //在文本區(qū)域里更新消息 } catch (IOException e) { System.out.println("端口 " + ports[port] + " :關(guān)閉"); jta.append("端口 " + ports[port] + " :關(guān)閉\n"); //產(chǎn)生異常表示端口關(guān)閉 } } } catch (UnknownHostException e) { e.printStackTrace(); } } //end of run() }//end of ScanMethod public JPanel getPanel() { JPanel jp = new JPanel(); jp.add(jb1, BorderLayout.CENTER); jp.setBorder(BorderFactory.createRaisedBevelBorder()); jp.setBackground(Color.lightGray); return jp; } public JPanel getPanel2() { JPanel jp = new JPanel(); JLabel jl = new JLabel(); jl.setText("請(qǐng)輸入主機(jī)名或ip地址,將掃描該主機(jī)的常見端口號(hào):"); jp.add(jl); jp.add(jtf); jp.setBorder(BorderFactory.createRaisedBevelBorder()); jp.setBackground(Color.LIGHT_GRAY); return jp; } public JPanel getPanel3() { JLabel jl1 = new JLabel(str1); JLabel jl2 = new JLabel(str2); JLabel jl3 = new JLabel(str3); JLabel jl4 = new JLabel(str4); JLabel jl5 = new JLabel(str5); JLabel jl6 = new JLabel(str6); JPanel jp = new JPanel(); jp.setLayout(new GridLayout(6, 1)); jp.add(jl1); jp.add(jl2); jp.add(jl3); jp.add(jl4); jp.add(jl5); jp.add(jl6); jp.setBorder(BorderFactory.createEtchedBorder()); //蝕刻邊框 return jp; } public static void main(String[] args) { new ScanPort(); } }
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java網(wǎng)絡(luò)編程技巧總結(jié)》、《Java Socket編程技巧總結(jié)》、《Java文件與目錄操作技巧匯總》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java 網(wǎng)絡(luò)編程socket編程等詳解
- Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程實(shí)例詳解
- 簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)
- Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程
- Java套接字(Socket)網(wǎng)絡(luò)編程入門
- Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例
- java網(wǎng)絡(luò)編程之socket網(wǎng)絡(luò)編程示例(服務(wù)器端/客戶端)
- Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法
- Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
- 詳解Java網(wǎng)絡(luò)編程
相關(guān)文章
SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決
這篇文章主要介紹了SpringBoot開發(fā)項(xiàng)目,引入JPA找不到findOne方法的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java開發(fā)反射機(jī)制的實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié)
反射是java中一種強(qiáng)大的工具,能夠使我們很方便的創(chuàng)建靈活的代碼,這些代碼可以再運(yùn)行時(shí)裝配,無(wú)需在組件之間進(jìn)行源代碼鏈接,但是反射使用不當(dāng)會(huì)成本很高,這篇文章主要給大家介紹了關(guān)于Java開發(fā)反射機(jī)制的相關(guān)資料,需要的朋友可以參考下2021-07-07用SpringBoot框架來(lái)接收multipart/form-data文件方式
這篇文章主要介紹了用SpringBoot框架來(lái)接收multipart/form-data文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02SpringCloud實(shí)戰(zhàn)小貼士之Zuul的路徑匹配
這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)小貼士之Zuul的路徑匹配,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10