扫描器Scanner、Set、Map的使用

本文详细介绍了Java中集合框架的使用方法,包括Scanner类的基本用法,Set集合及其迭代器的应用,以及Map集合的操作技巧。通过具体示例展示了如何进行数据的存储、检索和遍历。
public class 扫描器Scanner的使用 {
	public static void main(String[] args) {
		//定义一个扫描器对象
		Scanner scanner = new Scanner(System.in);
		扫描器Scanner的使用 t = new 扫描器Scanner的使用();
		int a;
		int b;
		while(true){
			//1.提示用户请输入一个加数
			System.out.println("请输入一个加数(整数):");
			//2.扫描一个整数
			a = scanner.nextInt();
			//3.提示用户请输入一个被加数
			System.out.println("请输入一个被加数(整数):");
			b = scanner.nextInt();
			
			int result = t.add(a, b);
			System.out.println("得到的结果是:"+result);
}

 
set集合以及迭代器的使用

public class Set集合的使用 {
	public static void main(String[] args) {
		//从Set集合中取值的时候按 哈希算法 取值
		Set<String> set = new HashSet<String>();

		boolean r1 = set.add("aaa");
		boolean r2 = set.add("bbb");
		boolean r3 = set.add("ccc");

		boolean r4 = set.add("eee");
		boolean r5 = set.add("fff");
		boolean r6 = set.add("ggg");

//		// System.out.println(set.contains("aaa"));
		// 我要你找fff内容
		// 获取/遍历set中的所有元素
		// 定义了一个迭代器,关联了set集合
		Iterator<String> iter = set.iterator();
		// 如何迭代
		while (iter.hasNext()) {
//              hasNext() 判断迭代器中有无元素  有则返回true
			String next = iter.next();
//              itter.next()   取值操作       
			System.out.println(next);
		}

		// 我要你找aaa

		// 获取/遍历set中的所有元素
		
	}

//	public String getFromSet(Set set ,String obj) {
//		// 定义了一个迭代器,关联了set集合
//		Iterator<String> iter1 = set.iterator();
//		// 如何迭代
//		while (iter1.hasNext()) {
//			String next = iter1.next();
//			if (next.equals(obj)) {
//				return next;
//			}
//		}
//		return null;
//	}
}

map集合的使用


public class Map集合的使用 {
	public static void main(String[] args) {
		Map<String,String> map = new HashMap<String,String>();
		
		map.put("a", "华信1");
//存值操作
		map.put("b", "华信2");
		map.put("c", "华信3");
		map.put("d", "华信4");
		
		//取数据
		String value = map.get("c");
		System.out.println(value);
		
		//map容器
		//涉及到map的遍历
               // 先取出map的k集合,遍历k的值找出对应的value值
		Set<String> keySet = map.keySet();
		Iterator<String> iterator = keySet.iterator();
		while(iterator.hasNext()){
			String k = iterator.next();
			String v = map.get(k);
			System.out.println("key="+k+"  value="+v);
		}
	
		
		
	}
}














将以下定时执行的方法优化为多线程处理,内部逻辑是需要对多个任务分别执行扫描,扫描完后修改任务状态,有很多个扫描器,扫描时间长。请推荐最佳实现方案:@Scheduled(fixedRate = 60000) public void checkPendingScannerData() { if (!initializationCompleted) return; log.info("开始检查待处理的扫描数据"); // 查询所有running状态和created状态的任务 List<Task> tasksList = taskMapper.selectList( new LambdaQueryWrapper<Task>() .in(Task::getStatus, TASK_STATUS_RUNNING, TASK_STATUS_CREATED) ); if (CollUtil.isEmpty(tasksList)) { log.info("没有发现 running 或 created 状态的任务"); return; } // 提取任务 ID Set<Long> taskIds = tasksList.stream().map(Task::getId).collect(Collectors.toSet()); // 查询这些任务对应的 ScannerData 数据,状态为 SCANNER_STATUS_PENDING List<ScannerData> scannerDataList = scannerDataService.list( new LambdaQueryWrapper<ScannerData>() .in(ScannerData::getTaskId, taskIds) .eq(ScannerData::getStatus, IScannerDataService.SCANNER_STATUS_PENDING) ); if (CollUtil.isEmpty(scannerDataList)) { log.info("这些任务没有对应的状态为 SCANNER_STATUS_PENDING 的 ScannerData 数据"); return; } log.info("发现 {} 条状态为 SCANNER_STATUS_PENDING 的 ScannerData 数据", scannerDataList.size()); // 更新扫描器对应任务节点为开始状态 tasksList.forEach(task -> { task.setNode(TaskNodeEnum.START.getCode()); task.setStatus(TASK_STATUS_RUNNING); }); taskMapper.updateBatch(tasksList); for (ScannerData scannerData : scannerDataList) { try { // 手动提交事务,每执行一个扫描器逻辑就提交 transactionTemplate.execute(status -> { ScannerData lockedData = null; try { // 使用悲观锁锁定单条数据 lockedData = scannerDataService.getOneForUpdate( new LambdaQueryWrapper<ScannerData>() .eq(ScannerData::getId, scannerData.getId()) .eq(ScannerData::getStatus, IScannerDataService.SCANNER_STATUS_PENDING) ); // 检查锁获取结果 if (lockedData == null) { log.warn("数据已被其他线程处理,ID:{}", scannerData.getId()); return null; // 跳出当前事务 } // 获取扫描器实例 AbstractScanner scanner = scannerFactory.createScanner(lockedData); // 执行扫描逻辑 scanner.triggerScan(lockedData); scannerDataService.updateById(lockedData); log.info("扫描任务处理成功,ID:{},扫描器类型:{}", lockedData.getId(), scanner.getClass().getSimpleName()); } catch (Exception e) { status.setRollbackOnly(); // 里层标记手动事务回滚 throw new RuntimeException(e); // 包装为unchecked异常 } return null; }); } catch (Exception e) { // 这边因为要独立更新状态,不能包含在手动提交的事务中。不然可能因为里层的异常事务回滚,导致事务无法提交 ScannerData failedData = new ScannerData(); failedData.setId(scannerData.getId()); failedData.setStatus(IScannerDataService.SCANNER_STATUS_FAILED); failedData.setErrMsg(e.getMessage()); scannerDataService.updateById(failedData); log.error("处理扫描数据失败,ID:{}", scannerData.getId(), e); } } }
10-21
实现带有 UI 界面的网络扫描器可以使用不同的编程语言和工具,以下分别介绍使用 Python 和 Java 的实现方法。 #### Python 实现 Python 可以使用内置的`socket`库进行网络扫描,使用`tkinter`库创建 UI 界面。以下是一个简单的端口扫描器示例代码: ```python import socket import tkinter as tk from tkinter import scrolledtext def scan_port(ip, port): try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(1) result = sock.connect_ex((ip, port)) if result == 0: return True else: return False sock.close() except socket.error: return False def start_scan(): ip_start = entry_ip_start.get() ip_end = entry_ip_end.get() port_start = int(entry_port_start.get()) port_end = int(entry_port_end.get()) ip_parts_start = list(map(int, ip_start.split('.'))) ip_parts_end = list(map(int, ip_end.split('.'))) current_ip_parts = ip_parts_start.copy() while current_ip_parts <= ip_parts_end: current_ip = '.'.join(map(str, current_ip_parts)) for port in range(port_start, port_end + 1): if scan_port(current_ip, port): text_area.insert(tk.END, f"Port {port} is open on {current_ip}\n") # 递增 IP 地址 current_ip_parts[3] += 1 for i in range(3, 0, -1): if current_ip_parts[i] > 255: current_ip_parts[i] = 0 current_ip_parts[i - 1] += 1 # 创建主窗口 root = tk.Tk() root.title("Simple Network Scanner") # 创建标签和输入框 label_ip_start = tk.Label(root, text="Start IP:") label_ip_start.pack() entry_ip_start = tk.Entry(root) entry_ip_start.pack() label_ip_end = tk.Label(root, text="End IP:") label_ip_end.pack() entry_ip_end = tk.Entry(root) entry_ip_end.pack() label_port_start = tk.Label(root, text="Start Port:") label_port_start.pack() entry_port_start = tk.Entry(root) entry_port_start.pack() label_port_end = tk.Label(root, text="End Port:") label_port_end.pack() entry_port_end = tk.Entry(root) entry_port_end.pack() # 创建扫描按钮 button_scan = tk.Button(root, text="Start Scan", command=start_scan) button_scan.pack() # 创建文本显示区域 text_area = scrolledtext.ScrolledText(root, width=40, height=10) text_area.pack() # 运行主循环 root.mainloop() ``` 此代码允许用户输入 IP 地址范围和端口范围,点击扫描按钮后开始扫描并在文本区域显示开放的端口信息。 #### Java 实现 Java 可以使用`java.net`包进行网络扫描,使用`Swing`或`JavaFX`创建 UI 界面。以下是一个简单的基于`Swing`的端口扫描器示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.Socket; public class NetworkScanner extends JFrame { private JTextField ipStartField, ipEndField, portStartField, portEndField; private JTextArea resultArea; public NetworkScanner() { setTitle("Network Scanner"); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout()); JLabel ipStartLabel = new JLabel("Start IP:"); ipStartField = new JTextField(15); JLabel ipEndLabel = new JLabel("End IP:"); ipEndField = new JTextField(15); JLabel portStartLabel = new JLabel("Start Port:"); portStartField = new JTextField(5); JLabel portEndLabel = new JLabel("End Port:"); portEndField = new JTextField(5); JButton scanButton = new JButton("Start Scan"); resultArea = new JTextArea(10, 30); JScrollPane scrollPane = new JScrollPane(resultArea); add(ipStartLabel); add(ipStartField); add(ipEndLabel); add(ipEndField); add(portStartLabel); add(portStartField); add(portEndLabel); add(portEndField); add(scanButton); add(scrollPane); scanButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String ipStart = ipStartField.getText(); String ipEnd = ipEndField.getText(); int portStart = Integer.parseInt(portStartField.getText()); int portEnd = Integer.parseInt(portEndField.getText()); // 这里可以添加 IP 范围扫描逻辑 for (int port = portStart; port <= portEnd; port++) { try { Socket socket = new Socket(ipStart, port); resultArea.append("Port " + port + " is open on " + ipStart + "\n"); socket.close(); } catch (IOException ex) { // 端口关闭或不可达 } } } }); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new NetworkScanner().setVisible(true); } }); } } ``` 该 Java 代码创建了一个简单的端口扫描器 UI,用户输入 IP 地址和端口范围后,点击扫描按钮开始扫描并显示开放的端口信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值