Java端口掃描

之前在找Java的端口掃描學習資料時候找到的,現在也不知道這些代碼究竟是從哪裏粘貼來的,於是原文的出處就不知道了,不過代碼的作者是很精明的,在包名里加上了自己的印記,我在這裏貼出來,也就不那麼過分慚愧了。

代碼貼上:

PortScanner

package Champion_netjava.PortScanner;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class PortScanner extends JFrame {

	private JTextField field_IP;// IP輸入框
	private JTextField field_start;// 起始端口輸入框
	private JTextField field_end;// 結束端口輸入框
	private JTextField field_threadNum;// 啓動的線程個數
	private String startPort = "0";// 默認始端口
	private String endPort = "65535";// 默認末端口
	private String threadNum = "2000";// 默認的線程個數
	private String IP = "218.196.110.211";// 默認的IP號
	private JTextArea area;// 用於顯示開放端口
	private javax.swing.JProgressBar bar;// 掃描端口的進度條

	public void init() {
		this.setTitle("端口掃描器");
		this.setSize(300, 350);
		this.setLayout(new FlowLayout());
		JButton button_start = new JButton("開始");
		JLabel label_IP = new JLabel("IP號:");
		JLabel label_threadNum = new JLabel("線程數:");
		JLabel label_start = new JLabel("始端口:");
		JLabel label_end = new JLabel("末端口:");
		field_IP = new JTextField(IP, 20);
		field_threadNum = new JTextField(threadNum, 10);
		field_start = new JTextField(startPort, 5);
		field_end = new JTextField(endPort, 5);
		area = new JTextArea(10, 25);
		// 創建滾動條對象
		JScrollPane scroll = new JScrollPane(area);
		scroll.setPreferredSize(new Dimension(230, 180));
		// 創建進度條對象
		bar = new javax.swing.JProgressBar();
		bar.setPreferredSize(new Dimension(230, 15));
		this.add(label_IP);
		this.add(field_IP);
		this.add(label_threadNum);
		this.add(field_threadNum);
		this.add(button_start);
		this.add(label_start);
		this.add(field_start);
		this.add(label_end);
		this.add(field_end);
		this.add(scroll);
		this.add(bar);
		this.setResizable(false);
		// 通過匿名內部類來創動作監聽器對象
		button_start.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				if ("開始".equals(e.getActionCommand())) {
					actionProcess();
					System.out.println("監聽器監聽了");
				}

			}

		});
		this.setDefaultCloseOperation(3);
		this.setVisible(true);

	}

	public static void main(String args[]) {
		PortScanner scanner = new PortScanner();
		scanner.init();

	}

	/**
	 * 響應動作監聽器的方法
	 */
	private void actionProcess() {
		// 得到起始端口
		int startPort = Integer.parseInt(field_start.getText());
		// 得到末端口
		int endPort = Integer.parseInt(field_end.getText());
		// 得到線程個數
		int threadNum = Integer.parseInt(field_threadNum.getText());
		// 設置進度條的最大值爲端口的個數
		bar.setMaximum(endPort - startPort);
		// 得到被掃描的IP號
		IP = field_IP.getText();
		//每一個線程所以掃描的對象
		int ports = (endPort - startPort) / threadNum;
		//取整後的端口餘數
		int left = (endPort - startPort) % threadNum;
		//創建進度條線程對象
		ProgressThread pt = new ProgressThread(bar);
		pt.start();
		//通過for循環來創建多個線程對象
		for (int i = 0; i < threadNum + 1; i++) {
			//創建掃描對象,線程分工掃描不同的端口號
			ScannerThread thread = new ScannerThread(IP, i * ports + startPort,
					(i + 1) * ports + startPort, area);
			thread.start();
		}
		//取整後剩餘的另外啓動一個線程來掃苗
		ScannerThread st = new ScannerThread(IP, endPort - left, endPort, area);
		st.start();

	}

}


ProgressThread

package Champion_netjava.PortScanner;

import javax.swing.JProgressBar;

public class ProgressThread extends Thread {
	private JProgressBar bar;
	// 判斷是否進度條是否停止
	private boolean isStop = false;

	public ProgressThread(JProgressBar bar) {
		this.bar = bar;
	}

	public void run() {
		while (!isStop) {
			// 得到已經掃描的端口
			int value = ScannerThread.count;
			try {
				//讓線程休眠10毫秒,避免CPU佔用率高
				Thread.sleep(10);
			} catch (Exception ef) {
				ef.printStackTrace();
			}
			//設置進度條的值
			bar.setValue(value);
			//設置進度條需要顯示的字符
			bar.setString("已掃描端口數:" + value);
			//設置進度條字符的可見性
			bar.setStringPainted(true);
			if (value >= bar.getMaximum()) {
				//如果進度條的值大於端口總數,則進度條停在
				isStop = true;
			}
		}

	}

}

ScannerThread

package Champion_netjava.PortScanner;

import java.net.Socket;

import javax.swing.JTextArea;

public class ScannerThread extends Thread {

	private int startPort, endPort;
	private String IP;
	private JTextArea area;
	// 已經掃描的端口數目
	public static int count = 0;
	// 重寫構造器
	public ScannerThread(String IP, int startPort, int endPort, JTextArea area) {
		this.startPort = startPort;
		this.endPort = endPort;
		this.IP = IP;
		this.area = area;
	}

	public void run() {
		for (int i = startPort; i <= endPort; i++) {
			try {
				Thread.sleep(10);
				// 根據指定的端口和端口號創建客戶端
				Socket client = new Socket(IP, i);
				// 如果牀成功,則該端口是開放的,顯示在窗體上
				area.append(i + "端口開放\n");
				// 關閉客戶端,並且移除,避免內存使用率高
				client.close();
				client = null;
				count++;
			} catch (Exception ef) {
				count++;
			}
		}

	}

}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章