wikki Geschrieben 20. Juni 2011 Autor Teilen Geschrieben 20. Juni 2011 Juhu würde mich riesig über deine Beispiele freuen! Zu den Exceptions, ich dachte halt das man damit die Meldungen vom Pingtest irgendwie auslesen kann und dann sagen kann "okay ip ist erreichbar, geb ich mal so zurück" ... aber da war ich mal wieder aufm holz weg-.- Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 20. Juni 2011 Teilen Geschrieben 20. Juni 2011 Ok, fangen wir nochmal mit der normalen Überprüfung an ob eine IP erreichbar, ein Beispiel dafür wurde ja am Anfang des Threads schonmal gepostet. Funktionen dafür bietet die Klasse InetAddress, genauer die Methode isReachable(int). Eine InetAddress Klasse aus einer IP erzeugst du mit der Methode %29]getByAddress(byte[]). Wenn du deine IPs einzeln als String vorliegen hast, kannst du folgendermaßen daraus eine InetAddress Klasse erzeugen: String[] ip = "127.0.0.1".split("\\."); InetAddress ia = null; try { ia = InetAddress.getByAddress(new byte[] { (byte)Integer.parseInt(ip[0]), (byte)Integer.parseInt(ip[1]), (byte)Integer.parseInt(ip[2]), (byte)Integer.parseInt(ip[3]) }); } catch (NumberFormatException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } (Wenn jemand eine elegantere Methode kennt die IP in byte Werte umzurechnen wäre ich daran auch interessiert) Mit der Methode isReachable(int) auf diesem Objekt kannst du nun überprüfen ob die IP erreichbar ist. Der Methode übergibst du einen Timeout Wert in Millisekunden. Und als Rückgabewert bekommst du ein true wenn die IP erreichbar bzw ein false wenn sie nicht erreichbar ist. Siehe dazu die Java Doku. Mit der Klasse Socket kannst du nun die Erreichbarkeit der Ports kontrollieren. Aus dem eben erzeugtem InetAddress Objekt und einer Portnummer kannst du ein Socket erzeugen. Dabei gibt wirft er dir eine ConnectException wenn der Port auf der Gegenseite nicht geöffnet ist. Wenn das Objekt also ohne Exception erzeugt wird, dann ist der Port auch offen. try { if(ia != null && ia.isReachable(5000)) { Socket s = null; try { s = new Socket(ia, 80); System.out.println("Port offen!"); } catch (ConnectException e) { System.out.println("Port nicht offen!"); } finally { if(s != null) s.close(); } } else { System.out.println("IP nicht erreichbar!"); } } catch (IOException e) { e.printStackTrace(); } Soweit ich bisher gesehen habe, sind Sockets in Java nicht wiederverwendbar, dementsprechend musst du dir auch für jeden neuen Port ein neues Socket erzeugen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 20. Juni 2011 Teilen Geschrieben 20. Juni 2011 Generell würde ich auf den Ping direkt verzichten, wenn eh Sockets verwendet werden, denn ein Ping ist ein ICMP Paket und das kann in der Firewall blockiert sein, d.h. wenn der Ping fehl schlängt bedeutet das nicht, dass auch eine Socket Verbindung zu einem Port fehl schlägt. Man würde versuchen zu der entsprechenden Adresse auf den entsprechenden Port zu verbinden und eben auswerten, ob die Verbindung fehl schlägt. Um ein InetAddress Objekt zu erzeugen verwendet man InetAddress (Java 2 Platform SE v1.4.2) (getByName), man kann direkt einen String mit Namen oder IP Adresse übergeben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wikki Geschrieben 20. Juni 2011 Autor Teilen Geschrieben 20. Juni 2011 Mal wieder ein DICKES Dankeschön an euch. Jetzt erschlage ich euch mal mit meinen Swing Code, da ich absolut keine Idee habe wie ich oberes da einsetzen soll? Der Code is am Ende des Posts... ich will vorher nochmal kurz erklären was passieren muss... Hier mal ein Bild von der Oberfläche: Drückt man den Button "Port Auswahl", so kann man den Standard deffinierten Port anwählen und neue Hinzufügen. Das geht schonmal - check ;D Drückt man den Button IP Liste öffnen, so kann man die IP Liste einbinden... das öffnen klappt schonmal... - check Drückt man nun auf Überprüfen...wirds abartig kompliziert.... Er soll nun die Auswahl aus beiden vorherigen Gebieten einholen, dann die IP´s überprüfen ob sie anpingbar sind ...dann das ganze wie da oben schon steht, aber erstmal würde mir reichen ihn einfach mal checken zu lassen ob die IP´s anpingbar sind.... Könnt Ihr mir da wieder helfen? :confused: Hier nun der Programmcode: import java.awt.Adjustable; import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import javax.swing.*; public class gui extends JFrame { //Alle Buttons private JButton ports = new JButton ("Port Auswahl"); private JButton ipListe = new JButton ("IP Daten öffnen.."); private JButton pruefen = new JButton ("Überprüfen"); //JMenu private JMenuBar menubar = new JMenuBar(); private JMenu datei = new JMenu("Datei"); private JMenuItem exit = new JMenuItem("Beenden"); private JMenuItem reset = new JMenuItem("Reset"); //Textfelder private JTextArea ausgabe = new JTextArea("Ausgabe \n ------------------------", 20,60); private JTextField tf = new JTextField(20); //Auswahlboxen DefaultListModel listModel = new DefaultListModel(); private JList auswahlports = new JList(listModel); //JFrame für die auswahl der Ports private JFrame portframe = new JFrame(); //JPanels private JPanel anleitung = new JPanel (); private JPanel auswertung = new JPanel(); private JPanel schaltfläche = new JPanel(); private JPanel anleitungport = new JPanel(); private JPanel portunten = new JPanel(); //JLabels private JLabel anleitung1 = new JLabel("How-To"); private JLabel erstens = new JLabel("1. Zuerst über den Button 'Port Auswahl' die Entsprechenden Ports wählen"); private JLabel zweitens = new JLabel("2. Anschließend die IP Bereichs-Liste laden"); private JLabel drittens = new JLabel("3. Überprüfen Klicken und es geht los!"); private JLabel portanlegen = new JLabel ("Bitte einen Port auswählen!"); private JLabel portanlegentf = new JLabel ("Neuer Eintrag: "); //öffnet eine Datei public void load() { JFileChooser fc = new JFileChooser(); int returnVal = fc.showOpenDialog(ipListe); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); } } public gui () { //Frame einstellungen setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(800,500); setResizable(false); setLocationRelativeTo(null); setLayout(new BorderLayout()); //Menü datei.add(reset); datei.add(exit); menubar.add(datei); setJMenuBar(menubar); //Anleitung auf JPanel platzieren und dies wiederum auf den JFrame setzen anleitung.setBorder(BorderFactory.createEtchedBorder()); anleitung.setSize(800,200); anleitung.setLayout(new GridLayout (4,2)); anleitung.add(anleitung1); anleitung.add(erstens); anleitung.add(zweitens); anleitung.add(drittens); add(anleitung, BorderLayout.PAGE_START); //Buttons auf Schaltfläche anordnen schaltfläche.setBorder(BorderFactory.createEtchedBorder()); schaltfläche.setSize(800,200); schaltfläche.setLayout(new GridLayout (1,2)); schaltfläche.add(ports); schaltfläche.add(ipListe); schaltfläche.add(pruefen); add(schaltfläche, BorderLayout.CENTER); //Auswertung auswertung.setBorder(BorderFactory.createEtchedBorder()); auswertung.setSize(800,200); auswertung.setLayout(new GridLayout (0,1)); ausgabe.setEditable(true); auswertung.add(ausgabe); add(auswertung, BorderLayout.PAGE_END); //Vorbereitung ComboBox auswahlports.setFixedCellHeight(27); auswahlports.setFixedCellWidth(150); listModel.addElement("47711"); tf.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { String text = ((JTextField)e.getSource()).getText(); listModel.addElement( text ); ((JTextField)e.getSource()).setText( "" ); } } ); //JFrame für die Auswahl der ports portframe.setDefaultCloseOperation(DISPOSE_ON_CLOSE); portframe.setSize(700,200); portframe.setLocationRelativeTo(anleitungport); portframe.setLayout(new BorderLayout()); //Anleitung IM neuem Fenster anleitungport.setBorder(BorderFactory.createEtchedBorder()); anleitungport.setLayout(new GridLayout (1,1)); anleitungport.add(portanlegen); portframe.add(anleitungport, BorderLayout.PAGE_START); portframe.add(auswahlports, BorderLayout.CENTER); portunten.setBorder(BorderFactory.createEtchedBorder()); portunten.add(portanlegentf); portunten.add(tf); portframe.add(portunten, BorderLayout.PAGE_END); //Port Button ruft portframe auf ports.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { portframe.setVisible(true); } }); //Üperprüfen Button... pruefen.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { } }); //Exit Button .. exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { System.exit(0); } }); //Reset reset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { ausgabe.setText("Ausgabe \n ------------------------"); } }); //IP Liste ipListe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { load(); } }); setVisible(true); } public static void main(String[] args) { new gui(); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sporticus Geschrieben 21. Juni 2011 Teilen Geschrieben 21. Juni 2011 (bearbeitet) Hi, also mein Vorschlag wäre, dass du die Ports und IP-Adressen, die der User eingeben kann, in jeweils einer List abspeicherst: (ich vermute mal, dass du jeden Port auf jeder IP-Adresse überprüfen willst) List<Integer> ports = new ArrayList<Integer>(); List<String> ips = new ArrayList<String>(); // in den ActionListener vom Button Überprüfen public void actionPerformed(ActionEvent e) { for(int ipIndex = 0; ipIndex < ips.size(); ipIndex++) { for(int portIndex = 0; portIndex < ports.size(); portIndex++) { Socket s = null; try { s = new Socket(InetAddress.getByName(ips.get(ipIndex), ports.get(portIndex)); System.out.println("Adresse["+ips.get(ipIndex)+"] & Port["+ports.get(portIndex)+"] ereichbar"); } catch (ConnectException e) { System.out.println("Adresse["+ips.get(ipIndex)+"] & Port["+ports.get(portIndex)+"] nicht ereichbar"); } finally { if(s != null) s.close(); } } } } Viele Grüße Bearbeitet 21. Juni 2011 von Sporticus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wikki Geschrieben 21. Juni 2011 Autor Teilen Geschrieben 21. Juni 2011 Hey, danke dir, sieht schon richtig gut aus. Er sagt mir nur das List<Integer> ports = new ArrayList<Integer>(); List<String> ips = new ArrayList<String>() The Type List is not generic Was bedeutet das wieder? <.< Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sporticus Geschrieben 21. Juni 2011 Teilen Geschrieben 21. Juni 2011 hast du drauf geachtet, dass es 'java.util.List' beim import ist? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wikki Geschrieben 21. Juni 2011 Autor Teilen Geschrieben 21. Juni 2011 hast du drauf geachtet, dass es 'java.util.List' beim import ist? ... danke... Nun kennt er nur noch nicht .getByName (...)is not applicable for the arguments (string, integer) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. Juni 2011 Teilen Geschrieben 21. Juni 2011 Wie wäre es, wenn Du Dich selbst einmal damit auseinander setzt und das nicht von anderen machen lässt? Der Lerneffekt ist dabei gleich null Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wikki Geschrieben 21. Juni 2011 Autor Teilen Geschrieben 21. Juni 2011 Da hast du natürlich recht. jedoch tu ich momentan nix anderes als Tutorials zu durchforsten...mir fehlt total die PRaxis in diesem Thema, weshalb ich eben auch über eure Hilfe dankbar bin... Die Anweisungen da oben sind schon recht komplex und ich habe keine Ahnung wieso getByName nicht funktionieren sollte?.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 21. Juni 2011 Teilen Geschrieben 21. Juni 2011 Die Anweisungen da oben sind schon recht komplex und ich habe keine Ahnung wieso getByName nicht funktionieren sollte?.. Wie wäre es die Fehlermeldung zu lesen und Dir die Signatur der Methode in der Doku anzuschauen und mit Deinem Code zu vergleichen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.