国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡單端口掃描器示例

2024-07-14 08:40:16
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡單端口掃描器。分享給大家供大家參考,具體如下:

在計(jì)算機(jī)網(wǎng)絡(luò)的學(xué)習(xí)中,不由得覺得這門課的零碎知識點(diǎn)異常之多,同時(shí)因?yàn)閷W(xué)習(xí)的課本是老外的教材——自頂向下方法,因此學(xué)習(xí)起來不免覺得吃力,但是從老外的教材里更能從一定高度理解計(jì)算機(jī)網(wǎng)絡(luò)的知識體系,也是樂在其中,同時(shí)做英語的習(xí)題感覺也很有趣味,從各方面來說可以說是獲益良多,認(rèn)識了很多專業(yè)詞匯。節(jié)課之后,便想做一個(gè)簡單的端口掃描器,用的語言是java,因?yàn)閷?shí)現(xiàn)界面很簡單,同時(shí)也有封裝好的Socket類可以使用,主要思路如下:

在主程序界面里輸入指定主機(jī)名或ip地址,按下start按鈕,就可以掃描主機(jī)的常用端口是否打開。內(nèi)部設(shè)置了常用端口號: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í)之前都沒有連接上,則該端口是關(guān)閉的,同時(shí)會產(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ò)知識就是套接字的使用。以及java內(nèi)部的List容器,java的界面設(shè)計(jì),界面布局,以及簡單的泛型編程的用法。

主要代碼如下:

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 } /*  * 掃描方式:針對一個(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ù)組沒有元素,返回,不執(zhí)行     return;    for (port = 0 + serial; port <= ports.length - 1; port += threadNumber) {     //每次運(yùn)行10個(gè)線程     socket = new Socket();     //為對象分配內(nèi)存空間     socketAddress = new InetSocketAddress(address, ports[port]);     try {      socket.connect(socketAddress, timeout);      //對目標(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("請輸入主機(jī)名或ip地址,將掃描該主機(jī)的常見端口號:");  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(); }}

希望本文所述對大家java程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泰顺县| 万年县| 许昌市| 宾阳县| 紫阳县| 澄江县| 银川市| 南澳县| 湘乡市| 泾源县| 南和县| 余姚市| 定兴县| 莒南县| 无锡市| 长乐市| 林州市| 乐山市| 襄汾县| 莎车县| 类乌齐县| 房产| 望谟县| 常宁市| 六盘水市| 来凤县| 精河县| 青浦区| 修武县| 余江县| 同仁县| 黎城县| 牙克石市| 介休市| 柳林县| 乌鲁木齐市| 井冈山市| 黔西| 治县。| 罗山县| 罗甸县|