swingworker类实现网络端口扫描
时间: 2023-08-16 19:03:27 浏览: 93
网络端口扫描
SwingWorker类是Java提供的一个用于在后台线程中执行长时间运行任务,并在任务完成后更新Swing组件的工具类。我们可以利用它来实现网络端口扫描。
首先,我们需要定义一个继承自SwingWorker的子类来执行网络端口扫描任务。在这个类中,我们需要重写doInBackground()方法以执行长时间运行的任务,例如网络端口扫描。然后,我们可以使用SwingWorker提供的publish()和process()方法来更新Swing组件的状态。
以下是一个简单的示例代码,用于在后台线程中执行网络端口扫描任务并在Swing组件中显示扫描结果:
```java
import java.net.*;
import java.util.List;
import javax.swing.*;
public class PortScanner extends SwingWorker<Void, Integer> {
private String ipAddress;
private int startPort;
private int endPort;
private JTextArea outputTextArea;
public PortScanner(String ipAddress, int startPort, int endPort, JTextArea outputTextArea) {
this.ipAddress = ipAddress;
this.startPort = startPort;
this.endPort = endPort;
this.outputTextArea = outputTextArea;
}
@Override
protected Void doInBackground() throws Exception {
for (int port = startPort; port <= endPort; port++) {
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);
socket.close();
publish(port);
} catch (Exception ex) {
// ignore exception
}
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
for (int port : chunks) {
outputTextArea.append("Port " + port + " is open\n");
}
}
}
```
在这个示例中,我们定义了一个名为PortScanner的SwingWorker子类,它接受一个IP地址、起始端口号、结束端口号和一个JTextArea组件作为参数。doInBackground()方法用于执行网络端口扫描任务,我们使用Socket类来连接每个端口并检查是否打开。如果端口是打开的,我们使用publish()方法将其端口号发布到SwingWorker,然后在process()方法中将其添加到JTextArea组件中显示。
接下来,我们可以在Swing应用程序中使用PortScanner类来执行网络端口扫描任务,如下所示:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MainFrame extends JFrame {
private JTextField ipAddressTextField;
private JTextField startPortTextField;
private JTextField endPortTextField;
private JTextArea outputTextArea;
private JButton scanButton;
public MainFrame() {
super("Port Scanner");
ipAddressTextField = new JTextField("127.0.0.1");
startPortTextField = new JTextField("1");
endPortTextField = new JTextField("65535");
outputTextArea = new JTextArea();
scanButton = new JButton("Scan");
JPanel inputPanel = new JPanel(new GridLayout(3, 2));
inputPanel.add(new JLabel("IP Address:"));
inputPanel.add(ipAddressTextField);
inputPanel.add(new JLabel("Start Port:"));
inputPanel.add(startPortTextField);
inputPanel.add(new JLabel("End Port:"));
inputPanel.add(endPortTextField);
JPanel buttonPanel = new JPanel();
buttonPanel.add(scanButton);
add(inputPanel, BorderLayout.NORTH);
add(new JScrollPane(outputTextArea), BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
scanButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String ipAddress = ipAddressTextField.getText();
int startPort = Integer.parseInt(startPortTextField.getText());
int endPort = Integer.parseInt(endPortTextField.getText());
PortScanner portScanner = new PortScanner(ipAddress, startPort, endPort, outputTextArea);
portScanner.execute();
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 400);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
}
```
在这个示例中,我们创建了一个名为MainFrame的Swing JFrame应用程序,它包含用于输入IP地址和端口范围的文本框,一个用于显示扫描结果的JTextArea组件以及一个用于触发扫描操作的按钮。当用户单击扫描按钮时,我们创建一个新的PortScanner对象并调用其execute()方法来执行网络端口扫描任务。执行结果将自动更新到JTextArea组件中显示。
总之,利用SwingWorker类可以很方便地实现网络端口扫描等长时间运行任务,并在Swing应用程序中显示执行结果。
阅读全文