Port scanner in JPanel

anyname

Grünschnabel
hallo
ich möchte ein Programm zum Ports bzw geöffnete Ports Scannen gestalten.
das Scannen soll sich im JPanel befinden (GUI). Während des Scannens sieht man einen Progressbar mit Fortschritt (im Prozent).

der Code ist:

Java:
public static Future<Boolean> portIsOpen(final ExecutorService es, final String ip, final int port, final int timeout) {
  return es.submit(new Callable<Boolean>() {
      @Override public Boolean call() {
        try {
          Socket socket = new Socket();
          socket.connect(new InetSocketAddress(ip, port), timeout);
          socket.close();
          return true;
        } catch (Exception ex) {
          return false;
        }
      }
   });
}

gibt es vielleicht besseren oder schnelleren Code?

Danke
 
Hi
Ich würde es so machen

Java:
package pscan;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class example implements ActionListener {

	/**
	 * @param args
	 */
	static JFrame frame = new JFrame();
	static JButton bt = new JButton();
	static JButton bt1 = new JButton();
	static JButton bt2 = new JButton();
	static JPanel panelcenter = new JPanel();
	static JPanel paneltop = new JPanel();
	static JPanel panelleft = new JPanel();
	static JLabel label1 = new JLabel("pressed");
	static JLabel label2 = new JLabel("pressed too");

	static JPanel panel2 = new JPanel();
	static JPanel panel3 = new JPanel();
	static JPanel contentpane = new JPanel();
	static JPanel contentpane2 = new JPanel();
	static BorderLayout bLayout = new BorderLayout();

	static Container cont = new Container();

	private String isopen = "";
	private String sortedisopen = "";
	private Object lock = new Object();

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		frame.setLayout(bLayout);
		bt.setText("Show");
		bt1.setText("Start Scan");
		panel2.add(label1);
		panel3.add(label2);
		paneltop.add(bt);
		paneltop.add(bt1);
		cont.add(panel2);

		panelleft.setBackground(Color.RED);
		panelcenter.setBackground(Color.BLUE);
		frame.add(paneltop, BorderLayout.NORTH);
		frame.add(panelleft, BorderLayout.WEST);
		frame.add(panelcenter, BorderLayout.CENTER);
		frame.setSize(400, 400);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		bt.addActionListener(new example());
		bt1.addActionListener(new example());
		bt2.addActionListener(new example());

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == bt) {
			frame.remove(bLayout.getLayoutComponent(BorderLayout.CENTER));
			frame.add(new JScrollPane(new JTextArea(this.sortedisopen)),
					BorderLayout.CENTER);
			frame.revalidate();
			frame.repaint();
		} else if (e.getSource() == bt1) {
			this.isopen = "";
			this.sortedisopen = "";
			this.scan("127.0.0.1", 15, 35);
		}
	}

	public void scan(String ad, int start, int end) {
		for (int i = start; i <= end; i++) {
			new threaderw(this, ad, i).start();
		}
	}

	public synchronized void write(String help) {
		synchronized (this.lock) {
			this.isopen = this.isopen + help + "\n";
			this.sortedisopen = this.sorter();
		}
		frame.remove(bLayout.getLayoutComponent(BorderLayout.CENTER));
		frame.add(new JScrollPane(new JTextArea(this.sortedisopen)),
				BorderLayout.CENTER);
		frame.revalidate();
		frame.repaint();

	}

	public String sorter() {
		List<String> sorter = new LinkedList<String>();
		StringTokenizer str = new StringTokenizer(this.isopen, "\n");
		String finalreturn = "";
		while (str.hasMoreTokens())
			sorter.add(str.nextToken());
		List<Integer> sorted = new LinkedList<Integer>();
		for (String h : sorter)
			try {
				sorted.add(Integer.parseInt(h.substring(5, 7)));
			} catch (Exception e) {
				sorted.add(Integer.parseInt(h.substring(5, 6)));
			}
		Collections.sort(sorted);
		for (Integer in : sorted) {
			for (int i = 0; i < sorter.size(); i++) {
				try {
					if (in == Integer.parseInt(sorter.get(i).substring(5, 7)))
						finalreturn = finalreturn + sorter.get(i) + "\n";
				} catch (Exception e) {
					if (in == Integer.parseInt(sorter.get(i).substring(5, 6)))
						finalreturn = finalreturn + sorter.get(i) + "\n";
				}
			}

		}
		return finalreturn;
	}
}

class threaderw extends Thread {
	private example writeback;
	private String ip;
	private int port;

	public threaderw(example back, String ad, int i) {
		this.writeback = back;
		this.ip = ad;
		this.port = i;
	}

	public void run() {
		try {
			Socket socket = new Socket(ip, port);
			writeback.write("Port " + port + " is open");
		} catch (Exception e) {
			writeback.write("Port " + port + " is closed");
		}
	}
}

Lg hendl
 
danke hendl, es hat geklappt ;) und wenn ich nur die geöffnete Ports zeigen will, was soll ich ändern?

hendl hat viele von meinen Fragen geantwortet und hat er nur ein vorheriges Beispiel geändert, deshalb für diejenigen die diesen Code verwenden wollen, müssen sie wissen das es einige JPanel und JLabel gibt, die nicht zu diesem Task gehören ;)
 
Um nur die geöffneten Ports anzuzeigen musst du einfach in threaderw die Zeile mit den geschlossenen Ports leer setzen.

Java:
 public void run() {
        try {
            Socket socket = new Socket(ip, port);
            writeback.write("Port " + port + " is open");
        } catch (Exception e) {
            writeback.write("");
        }
    }

Lg hendl
 
Zuletzt bearbeitet:
So mit ProgressBar und noch mal um die Ports schöner zu sortieren

Java:
package pscan;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class example implements ActionListener {

	/**
	 * @param args
	 */
	static JFrame frame = new JFrame();
	static JButton bt = new JButton();
	static JButton bt1 = new JButton();
	static JButton bt2 = new JButton();
	static JPanel panelcenter = new JPanel();
	static JPanel paneltop = new JPanel();
	static JPanel panelleft = new JPanel();
	static JLabel label1 = new JLabel("pressed");
	static JLabel label2 = new JLabel("pressed too");

	static JPanel panel2 = new JPanel();
	static JPanel panel3 = new JPanel();
	static JPanel contentpane = new JPanel();
	static JPanel contentpane2 = new JPanel();
	static BorderLayout bLayout = new BorderLayout();
	static JPanel paneltophelp = new JPanel();

	static Container cont = new Container();

	private String isopen = "";
	private String sortedisopen = "";
	private Object lock = new Object();
	private static JProgressBar progressBar = new JProgressBar();
	private int ports = 1;
	private int done = 0;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		paneltop.setLayout(new GridLayout(2, 1));
		frame.setLayout(bLayout);
		bt.setText("Show");
		bt1.setText("Start Scan");
		panel2.add(label1);
		panel3.add(label2);
		paneltophelp.add(bt);
		paneltophelp.add(bt1);
		paneltop.add(paneltophelp);
		paneltop.add(progressBar);
		progressBar.setMinimum(1);
		progressBar.setStringPainted(true);

		cont.add(panel2);

		panelleft.setBackground(Color.RED);
		panelcenter.setBackground(Color.BLUE);
		frame.add(paneltop, BorderLayout.NORTH);
		frame.add(panelleft, BorderLayout.WEST);
		frame.add(panelcenter, BorderLayout.CENTER);
		frame.setSize(400, 400);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		bt.addActionListener(new example());
		bt1.addActionListener(new example());
		bt2.addActionListener(new example());

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == bt) {
			frame.remove(bLayout.getLayoutComponent(BorderLayout.CENTER));
			frame.add(new JScrollPane(new JTextArea(this.sortedisopen)),
					BorderLayout.CENTER);
			frame.revalidate();
			frame.repaint();
		} else if (e.getSource() == bt1) {
			this.isopen = "";
			this.sortedisopen = "";
			this.ports = 1;
			this.done = 0;
			this.scan("127.0.0.1", 1, 25);
		}
	}

	public void scan(String ad, int start, int end) {
		this.ports = end - start;
		progressBar.setMaximum(this.ports);
		for (int i = start; i <= end; i++) {
			new threaderw(this, ad, i).start();
		}
	}

	public synchronized void write(String help) {
		synchronized (this.lock) {
			this.isopen = this.isopen + help + "\n";
			this.sortedisopen = this.sorter();
			this.done++;
		}
		this.progressBar.setValue(done);
		frame.remove(bLayout.getLayoutComponent(BorderLayout.CENTER));
		frame.add(new JScrollPane(new JTextArea(this.sortedisopen)),
				BorderLayout.CENTER);
		frame.revalidate();
		frame.repaint();

	}

	public String sorter() {
		List<String> sorter = new LinkedList<String>();
		StringTokenizer str = new StringTokenizer(this.isopen, "\n");
		String finalreturn = "";
		while (str.hasMoreTokens())
			sorter.add(str.nextToken());
		List<Integer> sorted = new LinkedList<Integer>();
		for (String h : sorter)
			try {
				sorted.add(Integer.parseInt(h.substring(5, 10)));
			} catch (Exception e1) {
				try {
					sorted.add(Integer.parseInt(h.substring(5, 9)));
				} catch (Exception e) {
					try {
						sorted.add(Integer.parseInt(h.substring(5, 8)));
					} catch (Exception e2) {
						try {
							sorted.add(Integer.parseInt(h.substring(5, 7)));
						} catch (Exception e3) {
							sorted.add(Integer.parseInt(h.substring(5, 6)));
						}
					}
				}
			}
		Collections.sort(sorted);
		for (Integer in : sorted) {
			for (int i = 0; i < sorter.size(); i++) {
				try {
					if (in == Integer.parseInt(sorter.get(i).substring(5, 10)))
						finalreturn = finalreturn + sorter.get(i) + "\n";
				} catch (Exception e) {
					try {
						if (in == Integer.parseInt(sorter.get(i)
								.substring(5, 9)))
							finalreturn = finalreturn + sorter.get(i) + "\n";
					} catch (Exception e4) {
						try {
							if (in == Integer.parseInt(sorter.get(i).substring(
									5, 8)))
								finalreturn = finalreturn + sorter.get(i)
										+ "\n";
						} catch (Exception e2) {
							try {
								if (in == Integer.parseInt(sorter.get(i)
										.substring(5, 7)))
									finalreturn = finalreturn + sorter.get(i)
											+ "\n";
							} catch (Exception e3) {
								if (in == Integer.parseInt(sorter.get(i)
										.substring(5, 6)))
									finalreturn = finalreturn + sorter.get(i)
											+ "\n";
							}

						}
					}
				}
			}
		}
		return finalreturn;
	}
}

class threaderw extends Thread {
	private example writeback;
	private String ip;
	private int port;

	public threaderw(example back, String ad, int i) {
		this.writeback = back;
		this.ip = ad;
		this.port = i;
	}

	public void run() {
		try {
			Socket socket = new Socket(ip, port);
			writeback.write("Port " + port + " is open");
		} catch (Exception e) {
			writeback.write("Port " + port + " is closed");
		}
	}
}

Edit
Was mir gerade noch einfällt wäre die maximale Anzahl an gerade laufenden Threads per ExecuterService zu begrenzen um nicht zu viele Ressourcen zu verbrauchen.
Lg hendl
 
Zuletzt bearbeitet:
Hmm bei mir ist kein Fehler, arbeite aber auch mit eclipse
Probier mal dass du die class threaderw umbennenst in PortScanThread zBsp.
und diese dann im Code änderst. Möglicherweise hast du schon eine Klasse die den gleichen Namen hat.

Lg hendl
 
Zurück