commit 00065e55773b83124cf84311a161ea82132b38ae
parent d236e597a9ea9f3df3296af632dfb87344b6a3f1
Author: Matthias Jaros <jaros@mailbox.org>
Date: Sun, 22 Feb 2026 21:12:51 +0100
Refactoring für bessere Visibility und Verständnis
Diffstat:
2 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/src/main/java/com/it_jaros/networkScanner/App.java b/src/main/java/com/it_jaros/networkScanner/App.java
@@ -8,9 +8,9 @@ public class App {
CliParser cliParser = new CliParser();
try {
ScanOptions options = cliParser.parseArgs(args);
- Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis());
- List<ScanResult> openPorts = scanner.scanPorts(options);
- printResults(openPorts);
+ Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis(),
+ options.delayInMillis());
+ printResults(scanner.scan(options));
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
cliParser.usageAndExit();
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java
@@ -21,32 +21,30 @@ public class Scanner {
private final Counter counter = new Counter();
private final ProgressBar progressBar = new ProgressBar();
- private final Semaphore socketCap;
+ private final Semaphore socketLimit;
private final int timeoutInMillis;
+ private final long delayInNanos;
- public Scanner(int socketLimit, int timeoutInMillis) {
+ public Scanner(int socketLimit, int timeoutInMillis, int delayInMillis) {
this.timeoutInMillis = timeoutInMillis;
- socketCap = new Semaphore(socketLimit);
+ this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis));
+ this.socketLimit = new Semaphore(socketLimit);
}
- public Scanner() {
- this(1000, 1000);
+ public List<ScanResult> scan(ScanOptions target) {
+ return scanTargets(target.targets(), target.ports());
}
- public List<ScanResult> scanPorts(ScanOptions target) {
- return scanPorts(target.targets(), target.delayInMillis(), target.ports());
- }
-
- public List<ScanResult> scanPorts(List<String> targets, int delayInMillis, String ports) {
+ public List<ScanResult> scanTargets(List<String> targets, String ports) {
List<ScanResult> results = new ArrayList<>();
- long delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, delayInMillis));
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) {
List<Progress> hosts = new ArrayList<>();
for (String target : targets) {
- PortRange portsRange = new PortRange(ports);
- Progress progress = new Progress(target, portsRange.getTotal(), new AtomicInteger(), new AtomicInteger());
+ PortRange portRange = new PortRange(ports);
+ Progress progress = new Progress(target, portRange.getTotal(), new AtomicInteger(),
+ new AtomicInteger());
hosts.add(progress);
- results.add(scanTarget(target, portsRange, delayInNanos, executor, progress));
+ results.add(scanTargetPorts(target, portRange, executor, progress));
}
progressBar.start(hosts);
}
@@ -56,7 +54,7 @@ public class Scanner {
return results;
}
- private ScanResult scanTarget(String target, PortRange portRange, long delayInNanos, ExecutorService executor,
+ private ScanResult scanTargetPorts(String target, PortRange portRange, ExecutorService executor,
Progress p) {
AtomicLong scanSlotFactory = new AtomicLong(System.nanoTime());
Queue<Integer> openPorts = new ConcurrentLinkedQueue<>();
@@ -64,12 +62,7 @@ public class Scanner {
final int currentPort = portRange.next();
executor.submit(() -> {
try {
- if (delayInNanos > 0) {
- long mySlot = scanSlotFactory.getAndAdd(delayInNanos);
- long wait = mySlot - System.nanoTime();
- if (wait > 0)
- LockSupport.parkNanos(wait);
- }
+ waitForSlot(scanSlotFactory);
if (isTargetPortOpen(target, currentPort)) {
openPorts.add(currentPort);
progressBar.onPortOpen(p);
@@ -82,8 +75,17 @@ public class Scanner {
return new ScanResult(target, openPorts);
}
+ private void waitForSlot(AtomicLong scanSlotFactory) {
+ if (delayInNanos > 0) {
+ long slot = scanSlotFactory.getAndAdd(delayInNanos);
+ long wait = slot - System.nanoTime();
+ if (wait > 0)
+ LockSupport.parkNanos(wait);
+ }
+ }
+
private boolean isTargetPortOpen(String target, int port) {
- socketCap.acquireUninterruptibly();
+ socketLimit.acquireUninterruptibly();
counter.inc();
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress(target, port), timeoutInMillis);
@@ -93,7 +95,7 @@ public class Scanner {
System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
} finally {
counter.dec();
- socketCap.release();
+ socketLimit.release();
}
return false;