Skip to content

Commit ab489a0

Browse files
committed
v1.14
1 parent d601a03 commit ab489a0

File tree

3 files changed

+92
-121
lines changed

3 files changed

+92
-121
lines changed

CHANGELOG.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
# Changes
22
All notable changes to this project will be documented in `CHANGELOG.md`.
33
## Added
4-
Nothing has been added.
4+
* `PopupHandler` - stops me from duplicating a bunch of code just for settings.
55

66
## Modified
7-
* Fixed the percentage going over 100%
8-
* Changed thread code a little bit
9-
* Added a "Hits" counter for successfully scanned servers
7+
* Thread handling has been modified to be (potentially) faster and use less lines of code.
108

119
## Removed
12-
Nothing has been removed.
10+
* Hits feature

src/com/stupidrepo/mcscanner/MCScanner.java

Lines changed: 26 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@
77
import java.net.Socket;
88
import java.nio.charset.StandardCharsets;
99
import java.util.ArrayList;
10+
import java.util.concurrent.ExecutorService;
11+
import java.util.concurrent.Executors;
12+
import java.util.concurrent.TimeUnit;
1013
import java.util.concurrent.atomic.AtomicInteger;
1114
import java.util.concurrent.atomic.AtomicReference;
1215
import java.util.logging.Level;
1316
import java.util.logging.Logger;
1417
import javax.swing.*;
1518

1619
public 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);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.stupidrepo.mcscanner;
2+
3+
import javax.swing.JButton;
4+
import javax.swing.JFrame;
5+
import javax.swing.JLabel;
6+
import javax.swing.JOptionPane;
7+
import javax.swing.JTextField;
8+
import javax.swing.WindowConstants;
9+
import java.awt.BorderLayout;
10+
import java.awt.event.WindowEvent;
11+
12+
public class PopupHandler {
13+
private final String message;
14+
private final String defaultText;
15+
private final String buttonText;
16+
17+
public String responseText;
18+
19+
public PopupHandler(String message, String defaultText, String buttonText) {
20+
this.message = message;
21+
this.defaultText = defaultText;
22+
this.buttonText = buttonText;
23+
}
24+
25+
public void showAndWait() {
26+
JFrame threadFrame = new JFrame("MCScanner");
27+
threadFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
28+
threadFrame.setSize(500, 125);
29+
threadFrame.setLayout(new BorderLayout());
30+
31+
JLabel threadLabel = new JLabel(this.message);
32+
threadLabel.setHorizontalAlignment(0);
33+
34+
threadFrame.add(threadLabel, "North");
35+
36+
JTextField threadField = new JTextField(this.defaultText);
37+
threadField.setHorizontalAlignment(0);
38+
39+
threadFrame.add(threadField, "Center");
40+
41+
JButton threadButton = new JButton(this.buttonText);
42+
threadFrame.add(threadButton, "East");
43+
44+
threadButton.addActionListener(e -> {
45+
this.responseText = threadField.getText();
46+
threadFrame.setVisible(false);
47+
threadFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
48+
threadFrame.dispatchEvent(new WindowEvent(threadFrame, 201));
49+
});
50+
51+
threadFrame.setVisible(true);
52+
53+
while(threadFrame.isVisible()) {
54+
try {
55+
Thread.sleep(100);
56+
} catch (InterruptedException e) {
57+
e.printStackTrace();
58+
}
59+
}
60+
61+
threadFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
62+
}
63+
}

0 commit comments

Comments
 (0)