Javaネットワークプログラミング実装の簡単なポートスキャナの例

8368 ワード

この例では、Javaネットワークプログラミング実装の簡単なポートスキャナについて説明します.皆さんの参考にしてください.具体的には以下の通りです.
コンピュータネットワークの学习の中で、思わずこの授业のこまごました知识の点が异常に多いと感じて、同时に学习の教科书は外国人の教材です――トップダウンの方法なので、学习するのはどうしても骨が折れると感じて、しかし外国人の教材の中から更に一定の高度からコンピュータネットワークの知识の体系を理解することができて、同じくその中で楽しくて、同时に英语の习题の感じもとても面白くて、各方面から言えば多くの利益を得ることができて、専門語をたくさん知った.授業の後、簡単なポートスキャナーを作りたいと思っています.使う言語はjavaです.インタフェースを実現するのは簡単です.同時に、パッケージされたSocketクラスもあります.主な考え方は以下の通りです.
メインプログラムインタフェースに指定したホスト名またはipアドレスを入力し、startボタンを押すと、ホストの共通ポートが開いているかどうかをスキャンできます.内部には常用ポート番号:21,22,23,25,26,69,80,110,143443,465,995,1080,11581433,1521,2100,3128,3306,33897001,8080,8081,9080,9090,43958が設置されている.自分で修正することもできます.プログラム実装の原理は,Javaを用いてSocketを確立してターゲットipの指定ポートに接続し,接続できればそのポートが開放されていることを証明することである.逆に、タイムアウト前に接続されていない場合は、ポートが閉じられ、異常が発生します.同時に,単一スレッドの操作効率が低いことを考慮し,Javaがマルチスレッドでプログラミングできるという特徴も利用し,マルチスレッドを用いてターゲットホストの1つのポートがオープンしているか否かをスキャンしたため,最終表示結果ではポートの並び順がランダムであり,内部設定は最大10個のスレッドを同時に実行できる(実際の状況に応じて変更できる).
主に使われるネット知識はソケットの使用です.Java内部のListコンテナ,javaのインタフェース設計,インタフェースレイアウト,および簡単な汎用プログラミングの使い方.
主なコードは次のとおりです.

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 {
 /**
  *          
  */
 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 portList = new LinkedList();//     List          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("   ", Font.BOLD, 16));
  jta.setLineWrap(true);//         
  jta.setWrapStyleWord(true);//          
  portList.addAll(Arrays.asList(ports));
  // ports      set ,      
  jb1.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    IP = jta.getText();
    //ip           
    scanPorts(IP, portList, 10, 800);
    //       800,      10
   }
  });
  this.setVisible(true);
 }
 /**
  *            List         
  *
  * @param ip
  *      IP   
  * @param portList
  *          List  
  * @param threadNumber
  *      
  * @param timeout
  *         
  * */
 public void scanPorts(String ip, List portSet,int threadNumber, int timeout) {
  ExecutorService threadPool = Executors.newCachedThreadPool();
  //   
  for (int i = 0; i < threadNumber; i++) {
   //10           
   ScanMethod scanMethod2 = new ScanMethod(ip, portSet,threadNumber, i, timeout);
   threadPool.execute(scanMethod2);
  }
  threadPool.shutdown();
  while (true) {
   if (threadPool.isTerminated()) {
    System.out.println("    ");
    break;
   }
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }// end of while
 }
 /*
  *     :           List      
  */
 private class ScanMethod implements Runnable {
  private String ip; //   IP
  private List portList; //        List  
  private int threadNumber, serial, timeout; //    ,       ,    
  public ScanMethod(String ip, List 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   
   try {
    InetAddress address = InetAddress.getByName(ip); //         ,    ip  
    Socket socket;//     
    SocketAddress socketAddress;//  ip   
    if (ports.length < 1)
     //       ,  ,   
     return;
    for (port = 0 + serial; port <= ports.length - 1; port += threadNumber) {
     //    10   
     socket = new Socket();
     //         
     socketAddress = new InetSocketAddress(address, ports[port]);
     try {
      socket.connect(socketAddress, timeout);
      //              ,       
      socket.close();
      //    
      System.out.println("   " + ports[port] + " :  ");
      jta.append("   " + ports[port] + " :  
"); // } catch (IOException e) { System.out.println(" " + ports[port] + " : "); jta.append(" " + ports[port] + " :
"); // } } } 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(" ip , :"); 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に関する詳細について興味のある読者は、「Javaネットワークプログラミングテクニックまとめ」、「Java Socketプログラミングテクニックまとめ」、「Javaファイルとディレクトリ操作テクニックまとめ」、「Javaデータ構造とアルゴリズムチュートリアル」、「Java操作DOMノードテクニックまとめ」、「Javaキャッシュ操作テクニックまとめ」のトピックを参照してください.
本文で述べたjavaプログラム設計に役立つことを願っています.