jscanner

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 25bd1759bb87ef7456ad7e4a997ac8425eda27bb
parent ebf068a3d6ff0f21ab990737fd2d9f470c9a192a
Author: Matthias Jaros <jaros@mailbox.org>
Date:   Mon,  6 Jul 2026 11:05:31 +0200

Changing scanner from collecting all results to a stream of output.
Saves RAM and is not necessary to first collect everything

Diffstat:
Msrc/main/java/com/it_jaros/jscanner/App.java | 2+-
Msrc/main/java/com/it_jaros/jscanner/Scan.java | 16+++-------------
Msrc/main/java/com/it_jaros/jscanner/Scanner.java | 11+++++------
3 files changed, 9 insertions(+), 20 deletions(-)

diff --git 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 @@ -13,23 +13,17 @@ import java.util.stream.Stream; */ public class Scan { private final Stream<String> hosts; - private final ScanState state; private final String ports; private final Counter counter; private final ProgressBar progressBar; - private Scan(Stream<String> hosts, String ports, ScanState state, boolean quiet) { + private Scan(Stream<String> 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<ScanResult> getResults() { - return this.state.getCopyOfResults(); - } - public int getPeakConcurrentConnects() { return counter.max(); } @@ -70,11 +64,11 @@ public class Scan { } private static Scan create(Stream<String> lines, String ports, boolean quiet) { - return new Scan(lines, ports, new ScanState(), quiet); + return new Scan(lines, ports, quiet); } public static Scan create(List<String> hostsArgv, String ports, boolean quiet) { - return new Scan(hostsArgv.stream(), ports, new ScanState(), quiet); + return new Scan(hostsArgv.stream(), ports, quiet); } public Stream<String> 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 @@ -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<ScanResult> runScan(final Scan scan) { + public void runScan(final Scan scan, final Consumer<ScanResult> 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