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++;
			}
		}

	}

}


 

 

public static JFrame main=new JFrame("JAVA端口扫描器"); //显示扫描结果 public static JTextArea Result=new JTextArea("",4,40); //滚动条面板 public static JScrollPane resultPane = new JScrollPane(Result,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); //输入主机名文本框 public static JTextField hostname=new JTextField("localhost",8); //输入ip地址前3位的输入框 public static JTextField fromip1=new JTextField("0",3); //输入ip地址4~6位的输入框 public static JTextField fromip2=new JTextField("0",3); //输入ip地址7~9位的输入框 public static JTextField fromip3=new JTextField("0",3); //输入起始ip地址最后4位的输入框 public static JTextField fromip4=new JTextField("0",3); //输入目标ip地址最后4位的输入框 public static JTextField toip=new JTextField("0",3); //输入最小端口的输入框 public static JTextField minPort=new JTextField("0",4); //输入最大端口的输入框 public static JTextField maxPort=new JTextField("1000",4); //输入最大线程数量的输入框 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 static JRadioButton radioIp = new JRadioButton("IP地址:"); public static JRadioButton radioHost = new JRadioButton("主机名:",true); //单选框组 public static ButtonGroup group = new ButtonGroup(); public static JLabel P1=new JLabel("端口范围:"); public static JLabel P2=new JLabel("~"); 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("线程数:"); public static JLabel RST=new JLabel("扫描结果: "); 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 JButton("保存扫描结果"); //菜单栏 public static JMenuBar myBar = new JMenuBar(); public static JMenu myMenu = new JMenu("文件(F)"); public static JMenuItem saveItem = new JMenuItem("保存扫描结果(S)"); public static JMenuItem exitItem = new JMenuItem("退出(Q)"); public static JMenu myMenu2 = new JMenu("帮助"); public static JMenuItem helpItem = new JMenuItem("阅读"); public static void main(String[] 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); myMenu2.add(helpItem); myBar.add(myMenu); myBar.add(myMenu2); main.setJMenuBar(myBar); //设置热键 myMenu.setMnemonic('F'); saveItem.setMnemonic ('S'); //为“另存为”组件设置快捷键为ctrl+s saveItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK)); exitItem.setMnemonic('Q'); exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_E,InputEvent.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); group.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.gridy = 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 = GridBagConstraints.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 = GridBagConstraints.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.gridx = 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.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 = 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(maxPort,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);
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值