之前在找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++;
}
}
}
}