javaswing结合swingwoker实现单机扫描和多机扫描
时间: 2023-12-08 15:05:36 浏览: 126
Java Swing 是一个用于创建桌面应用程序的GUI工具包,SwingWorker 则是一个在后台线程中执行长时间运行任务的工具类。结合这两个工具,可以实现单机扫描和多机扫描。
1. 单机扫描
单机扫描是指在本机上运行扫描程序,扫描本机的文件或端口等信息。下面是一个使用SwingWorker实现的单机扫描的例子:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class ScanDemo extends JFrame {
private JLabel statusLabel;
private JTextArea resultArea;
private JButton startButton;
public ScanDemo() {
super("单机扫描");
statusLabel = new JLabel("准备就绪");
resultArea = new JTextArea(20, 50);
resultArea.setEditable(false);
startButton = new JButton("开始扫描");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startButton.setEnabled(false);
statusLabel.setText("正在扫描...");
new ScanWorker().execute();
}
});
JPanel panel = new JPanel(new BorderLayout());
panel.add(statusLabel, BorderLayout.NORTH);
panel.add(new JScrollPane(resultArea), BorderLayout.CENTER);
panel.add(startButton, BorderLayout.SOUTH);
setContentPane(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
}
private class ScanWorker extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() throws Exception {
// 扫描操作,这里只是一个演示
for (int i = 1; i <= 100; i++) {
Thread.sleep(50);
publish("扫描到第" + i + "个文件");
}
return null;
}
@Override
protected void process(List<String> chunks) {
for (String chunk : chunks) {
resultArea.append(chunk + "\n");
}
}
@Override
protected void done() {
startButton.setEnabled(true);
statusLabel.setText("扫描完成");
}
}
public static void main(String[] args) {
new ScanDemo().setVisible(true);
}
}
```
在这个例子中,我们创建了一个界面,包含一个状态标签、一个结果文本框和一个开始扫描按钮。当用户点击开始扫描按钮后,我们创建一个SwingWorker实例,并调用它的execute()方法开始执行扫描操作。在SwingWorker的doInBackground()方法中执行扫描操作,并使用publish()方法将扫描结果发布出去。在SwingWorker的process()方法中将扫描结果更新到结果文本框中。在SwingWorker的done()方法中恢复开始扫描按钮的状态,更新状态标签的文本。
2. 多机扫描
多机扫描是指在多台机器上运行扫描程序,扫描这些机器的文件或端口等信息。多机扫描需要使用到网络通信,这里我们使用Java的Socket编程来实现。下面是一个使用SwingWorker和Socket编程实现的多机扫描的例子:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ScanDemo extends JFrame {
private JLabel statusLabel;
private JTextArea resultArea;
private JButton startButton;
public ScanDemo() {
super("多机扫描");
statusLabel = new JLabel("准备就绪");
resultArea = new JTextArea(20, 50);
resultArea.setEditable(false);
startButton = new JButton("开始扫描");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startButton.setEnabled(false);
statusLabel.setText("正在扫描...");
new ScanWorker().execute();
}
});
JPanel panel = new JPanel(new BorderLayout());
panel.add(statusLabel, BorderLayout.NORTH);
panel.add(new JScrollPane(resultArea), BorderLayout.CENTER);
panel.add(startButton, BorderLayout.SOUTH);
setContentPane(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
}
private class ScanWorker extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() throws Exception {
List<String> hosts = getHosts(); // 获取要扫描的主机列表
int port = 80; // 要扫描的端口
for (String host : hosts) {
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
socket = new Socket(host, port);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("GET / HTTP/1.1\r\nHost: " + host + "\r\n\r\n");
String line;
while ((line = in.readLine()) != null) {
publish(host + ": " + line);
}
} catch (Exception e) {
publish(host + ": 连接失败");
} finally {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
if (socket != null) {
socket.close();
}
}
}
return null;
}
private List<String> getHosts() {
List<String> hosts = new ArrayList<>();
hosts.add("www.baidu.com");
hosts.add("www.google.com");
hosts.add("www.microsoft.com");
return hosts;
}
@Override
protected void process(List<String> chunks) {
for (String chunk : chunks) {
resultArea.append(chunk + "\n");
}
}
@Override
protected void done() {
startButton.setEnabled(true);
statusLabel.setText("扫描完成");
}
}
public static void main(String[] args) {
new ScanDemo().setVisible(true);
}
}
```
在这个例子中,我们创建了一个界面,包含一个状态标签、一个结果文本框和一个开始扫描按钮。当用户点击开始扫描按钮后,我们创建一个SwingWorker实例,并调用它的execute()方法开始执行扫描操作。在SwingWorker的doInBackground()方法中执行扫描操作,使用Socket连接每个要扫描的主机,并发送HTTP请求获取响应数据。在SwingWorker的process()方法中将扫描结果更新到结果文本框中。在SwingWorker的done()方法中恢复开始扫描按钮的状态,更新状态标签的文本。
阅读全文