代碼貼上:
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++;
}
}
}
}