77import java .net .Socket ;
88import java .nio .charset .StandardCharsets ;
99import java .util .ArrayList ;
10+ import java .util .concurrent .ExecutorService ;
11+ import java .util .concurrent .Executors ;
12+ import java .util .concurrent .TimeUnit ;
1013import java .util .concurrent .atomic .AtomicInteger ;
1114import java .util .concurrent .atomic .AtomicReference ;
1215import java .util .logging .Level ;
1316import java .util .logging .Logger ;
1417import javax .swing .*;
1518
1619public class MCScanner {
17- public static void main (String [] var0 ) {
20+ public static void main (String [] var0 ) throws IllegalArgumentException , IllegalAccessException , NoSuchFieldException , SecurityException {
1821 AtomicInteger threads = new AtomicInteger (1024 );
1922 int timeout = 1000 ;
2023 int minimumRange = 1 ;
@@ -28,97 +31,19 @@ public static void main(String[] var0) {
2831
2932 AtomicReference <String > uri = new AtomicReference <>("mongodb://localhost:27017" );
3033
31- JFrame threadFrame = new JFrame ("MCScanner v" + version );
32- threadFrame .setDefaultCloseOperation (WindowConstants .DISPOSE_ON_CLOSE );
33- threadFrame .setSize (500 , 125 );
34- threadFrame .setLayout (new BorderLayout ());
34+ PopupHandler threadsPopup = new PopupHandler ("How many threads would you like to use?" , "1024" , "OK" );
35+ threadsPopup .showAndWait ();
3536
36- JLabel threadLabel = new JLabel ("Threads to use (default is 1024, recommended is 1024-2048):" );
37- threadLabel .setHorizontalAlignment (0 );
38-
39- threadFrame .add (threadLabel , "North" );
40-
41- JTextField threadField = new JTextField ("1024" );
42- threadField .setHorizontalAlignment (0 );
43-
44- threadFrame .add (threadField , "Center" );
45-
46- JButton threadButton = new JButton ("OK" );
47- threadFrame .add (threadButton , "East" );
48-
49- JButton quitButton = new JButton ("Quit" );
50- threadFrame .add (quitButton , "South" );
51-
52- threadButton .addActionListener (e -> {
53- try {
54- Integer .parseInt (threadField .getText ());
55- } catch (NumberFormatException exception ) {
56- JOptionPane .showMessageDialog (null , "Invalid number." , "Error" , JOptionPane .ERROR_MESSAGE );
57- return ;
58- }
59- threads .set (Integer .parseInt (threadField .getText ()));
60- threadFrame .setVisible (false );
61- threadFrame .dispatchEvent (new WindowEvent (threadFrame , 201 ));
62- });
63-
64- quitButton .addActionListener (e -> {
65- threadFrame .setVisible (false );
66- threadFrame .dispatchEvent (new WindowEvent (threadFrame , 201 ));
67- System .exit (0 );
68- });
69-
70- threadFrame .setVisible (true );
71-
72- while (threadFrame .isVisible ()) {
73- try {
74- Thread .sleep (100 );
75- } catch (InterruptedException e ) {
76- e .printStackTrace ();
77- }
37+ try {
38+ threads .set (Integer .parseInt (threadsPopup .responseText ));
39+ } catch (NumberFormatException e ) {
40+ logger .log (Level .SEVERE , "Invalid thread count." );
7841 }
7942
80- JFrame mongoFrame = new JFrame ("MCScanner v" + version );
81- mongoFrame .setDefaultCloseOperation (WindowConstants .DISPOSE_ON_CLOSE );
82- mongoFrame .setSize (500 , 125 );
83- mongoFrame .setLayout (new BorderLayout ());
84-
85- JLabel mongoLabel = new JLabel ("MongoDB URI (default is mongodb://localhost:27017):" );
86- mongoLabel .setHorizontalAlignment (0 );
87-
88- mongoFrame .add (mongoLabel , "North" );
89-
90- JTextField mongoField = new JTextField ("mongodb://localhost:27017" );
91- mongoField .setHorizontalAlignment (0 );
92-
93- mongoFrame .add (mongoField , "Center" );
94-
95- JButton mongoButton = new JButton ("OK" );
96- mongoFrame .add (mongoButton , "East" );
43+ PopupHandler mongoDBURIPopup = new PopupHandler ("Enter the URI to the MongoDB database:" , "mongodb://localhost:27017" , "Done" );
44+ mongoDBURIPopup .showAndWait ();
9745
98- JButton mQuitButton = new JButton ("Quit" );
99- mongoFrame .add (mQuitButton , "South" );
100-
101- mongoButton .addActionListener (e -> {
102- uri .set (mongoField .getText ());
103- mongoFrame .setVisible (false );
104- mongoFrame .dispatchEvent (new WindowEvent (threadFrame , 201 ));
105- });
106-
107- mQuitButton .addActionListener (e -> {
108- mongoFrame .setVisible (false );
109- mongoFrame .dispatchEvent (new WindowEvent (threadFrame , 201 ));
110- System .exit (0 );
111- });
112-
113- mongoFrame .setVisible (true );
114-
115- while (mongoFrame .isVisible ()) {
116- try {
117- Thread .sleep (100 );
118- } catch (InterruptedException e ) {
119- e .printStackTrace ();
120- }
121- }
46+ uri .set (mongoDBURIPopup .responseText );
12247
12348 DatabaseHandler databaseHandler = new DatabaseHandler (uri .get ());
12449
@@ -130,6 +55,7 @@ public static void main(String[] var0) {
13055 frame .setLayout (new BorderLayout ());
13156
13257 double progressThing = (maxRange - minimumRange + 1 ) * 256 * 256 ;
58+
13359 ArrayList < Thread > threadList = new ArrayList < Thread > ();
13460
13561 JLabel scannedLabel = new JLabel ("Scanned: 0/" + progressThing * 256 );
@@ -138,37 +64,26 @@ public static void main(String[] var0) {
13864 frame .add (scannedLabel , "Center" );
13965
14066 long scanned = 0 ;
141- long hits = 0 ;
142-
143- JLabel hitsLabel = new JLabel ("Hits: 0/0" );
144- hitsLabel .setHorizontalAlignment (0 );
145-
146- frame .add (hitsLabel , "South" );
14767
14868 frame .setVisible (true );
14969
150- // TODO: Make this whole thing more efficient, and less ugly.
70+ ExecutorService executor = Executors .newFixedThreadPool (threads .get ());
71+
15172 for (int i = minimumRange ; i <= maxRange ; ++i ) {
15273 for (int j = 0 ; j <= 255 ; ++j ) {
15374 for (int k = 0 ; k <= 255 ; ++k ) {
15475 for (int l = 0 ; l <= 255 ; ++l ) {
15576 String ip = i + "." + j + "." + k + "." + l ;
156-
157- ScannerThread scannerThread = new ScannerThread (ip , port , timeout , databaseHandler );
158- Thread scanThread = new Thread (scannerThread );
159- threadList .add (scanThread );
160- scanThread .start ();
161-
77+
78+ Thread scannerThread = new Thread (new ScannerThread (ip , port , timeout , databaseHandler ));
79+ threadList .add (scannerThread );
80+ executor .execute (scannerThread );
81+
16282 if (threadList .size () >= threads .get ()) {
16383 for (Thread nextThread : threadList ) {
16484 try {
16585 nextThread .join ();
16686 ++scanned ;
167- if (scannerThread .didHit ) {
168- ++hits ;
169- }
170- // progressBar.setValue(scanned);
171- hitsLabel .setText ("Hits: " + hits + "/" + scanned );
17287 scannedLabel .setText ("Scanned: " + scanned + "/" + progressThing * 256 + " (" + Math .round ((scanned / (progressThing * 256 )) * 100 ) / 100 + "%)" );
17388 } catch (InterruptedException timeout2 ) {
17489 // eh
@@ -181,16 +96,11 @@ public static void main(String[] var0) {
18196 }
18297 }
18398
184- for (Thread nextThreadAgain : threadList ) {
185- try {
186- nextThreadAgain .join ();
187- ++scanned ;
188- // progressBar.setValue(scanned);
189- hitsLabel .setText ("Hits: " + hits + "/" + scanned );
190- scannedLabel .setText ("Scanned: " + scanned + "/" + progressThing * 256 );
191- } catch (InterruptedException timeout1 ) {
192- // well
193- }
99+ try {
100+ executor .shutdown ();
101+ executor .awaitTermination (Long .MAX_VALUE , TimeUnit .NANOSECONDS );
102+ } catch (InterruptedException e ) {
103+ logger .log (Level .SEVERE , "Interrupted while waiting for threads to finish." );
194104 }
195105
196106 frame .setVisible (false );
0 commit comments