From d2ab45e7ecdfee71806eb0388527cd50ba96975d Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Mon, 6 Jul 2026 11:05:31 +0200 Subject: Changing scanner from collecting all results to a stream of output. Saves RAM and is not necessary to first collect everything --- src/main/java/com/it_jaros/jscanner/App.java | 2 +- src/main/java/com/it_jaros/jscanner/Scan.java | 16 +++------------- src/main/java/com/it_jaros/jscanner/Scanner.java | 11 +++++------ 3 files changed, 9 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/main/java/com/it_jaros/jscanner/App.java b/src/main/java/com/it_jaros/jscanner/App.java index 700b3f0..42d2321 100644 --- a/src/main/java/com/it_jaros/jscanner/App.java +++ b/src/main/java/com/it_jaros/jscanner/App.java @@ -24,7 +24,7 @@ public class App { try (Scanner scanner = new Scanner(options)) { Scan scan = Scan.create(options); addShutdownHook(scanner); - printScanResults(scanner.runScan(scan), scan.getPeakConcurrentConnects(), options.showFilteredPorts()); + scanner.runScan(scan, result -> printPortsResults(result, options.showFilteredPorts())); } finally { shutdownLatch.countDown(); removeShutdownHook(); diff --git a/src/main/java/com/it_jaros/jscanner/Scan.java b/src/main/java/com/it_jaros/jscanner/Scan.java index 75ed349..bdc3f3a 100644 --- a/src/main/java/com/it_jaros/jscanner/Scan.java +++ b/src/main/java/com/it_jaros/jscanner/Scan.java @@ -13,23 +13,17 @@ import java.util.stream.Stream; */ public class Scan { private final Stream hosts; - private final ScanState state; private final String ports; private final Counter counter; private final ProgressBar progressBar; - private Scan(Stream hosts, String ports, ScanState state, boolean quiet) { + private Scan(Stream hosts, String ports, boolean quiet) { this.hosts = hosts; this.ports = ports; - this.state = state; this.counter = new Counter(); this.progressBar = new ProgressBar(quiet); } - public List getResults() { - return this.state.getCopyOfResults(); - } - public int getPeakConcurrentConnects() { return counter.max(); } @@ -70,11 +64,11 @@ public class Scan { } private static Scan create(Stream lines, String ports, boolean quiet) { - return new Scan(lines, ports, new ScanState(), quiet); + return new Scan(lines, ports, quiet); } public static Scan create(List hostsArgv, String ports, boolean quiet) { - return new Scan(hostsArgv.stream(), ports, new ScanState(), quiet); + return new Scan(hostsArgv.stream(), ports, quiet); } public Stream getHosts() { @@ -105,8 +99,4 @@ public class Scan { public void decSocketCounter() { counter.dec(); } - - public void addScanResult(ScanResult scanResult) { - state.addScanResult(scanResult); - } } diff --git a/src/main/java/com/it_jaros/jscanner/Scanner.java b/src/main/java/com/it_jaros/jscanner/Scanner.java index 40c2e23..3e655a5 100644 --- a/src/main/java/com/it_jaros/jscanner/Scanner.java +++ b/src/main/java/com/it_jaros/jscanner/Scanner.java @@ -10,6 +10,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; import java.util.function.Function; public class Scanner implements AutoCloseable { @@ -54,9 +55,8 @@ public class Scanner implements AutoCloseable { * Starts a given scan. * * @param scan - * @return */ - public List runScan(final Scan scan) { + public void runScan(final Scan scan, final Consumer consumer) { if (scan == null) { throw new IllegalArgumentException("Scan argument cannot be null"); } @@ -88,9 +88,8 @@ public class Scanner implements AutoCloseable { // No matter what happens we have to free the resources after getting ScanResult try { ScanResult result = finishedHost.get(); - // we only want results that give value and not cost RAM for nothing - if (!result.openPorts().isEmpty() || !result.filteredPorts().isEmpty()) { - scan.addScanResult(result); + if (result != null) { + consumer.accept(result); } } finally { state.activeWorkers().release(); @@ -104,7 +103,6 @@ public class Scanner implements AutoCloseable { } scan.stop(); - return scan.getResults(); } /** @@ -155,6 +153,7 @@ public class Scanner implements AutoCloseable { try { PortResult portResult = portResultFuture.get(); + if (portResult == null) continue; switch (portResult.getState()) { case OPEN -> { // bitset is not thread-safe, so it is set -- cgit v1.3.1