Zum Inhalt springen

IP Liste laden -> IP´s anpingen


wikki

Empfohlene Beiträge

Hiho!

Ich habe ein neues Problem...

Ich möchte gern eine Datei einlesen, in welcher IP Adressen stehen, das habe ich (bestimmt nicht "einwandfrei") schonmal gemacht:

Mit Swing

public class einlesen_Swing extends JFrame{


    public einlesen_Swing() {

        super("Eingelesene Datei");

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JTextArea textArea = new JTextArea();

        try {

            textArea.read(new FileReader("c:/ip.txt"), "");

        } catch (Exception e) {

            e.printStackTrace();

        }

        JScrollPane scrollPane = new JScrollPane(textArea);

        scrollPane.setPreferredSize(new Dimension(320, 240));

        add(scrollPane);

        pack();

        setVisible(true);

    }


    public static void main(String[] args) {

        new einlesen_Swing();

    }

}
Ohne Swing
public class einlesen {

	public static void main(String[] args) {

	Reader leser = null;


		try {

		leser = new FileReader("/ip.txt");

		for (int x; (x =leser.read()) !=-1 

		System.out.print((char) x);

		}

		catch (IOException e)

		{

			System.err.println("Fehler beim Lesen der Datei");

		}

		finally {

			try {leser.close();} catch (Exception e){}

		}

	}


}[/code]

In der ip.txt stehen einige IP Adressen...diese sollen angepingt werden. Jedoch habe ich absolut keine Idee wie das gehen soll?

Kennt Ihr da Anleitungen oder könnt mir direkt helfen?

Würde mich sehr freuen!

grüße!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke!

Leider kann ich daraus nichts lernen...

Wie kann ich das 2. Beispiel (weil das würde ja meinem Programm direkt sagen "ja ip ist da" oder eben "ne ip ist nicht erreichbar") so nutzen das es die IP´s aus der *.txt Datei einliest und abarbeitet?

Link zu diesem Kommentar
Auf anderen Seiten teilen

In beiden Fällen ist auf jeden Fall noch Anpassungsbedarf vorhanden, damit du die IP Adressen dann auch wirklich zum pingen benutzen kannst. Ich würde an deiner Stelle auch an der zweiten Möglichkeit weiter arbeiten. Die mit der TextArea bringt dir halt nicht viel, du hast dann zwar die IP Adressen erstmal im Programm...aber mehr halt auch nicht, die einzelnen IP Adressen bekommst du aus der TextArea auch so noch nicht raus.

Ansonsten wie sind denn die IP Adressen in der Textdatei abgespeichert? Jede IP in einer Zeile? Durch Kommas getrennt?

Und sobald das Auslesen dir immer jeweils eine IP zurück liefert, kannst du anfangen darüber nachzudenken ob du gleich beim Auslesen die IPs anpingen willst. Wenn nicht, solltest du die auch noch zwischenspeichern. In einer Liste, oder wenn du vorher genau weißt wie viele IPs es sind, geht auch ein Array.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ansonsten wie sind denn die IP Adressen in der Textdatei abgespeichert? Jede IP in einer Zeile? Durch Kommas getrennt?

Und sobald das Auslesen dir immer jeweils eine IP zurück liefert, kannst du anfangen darüber nachzudenken ob du gleich beim Auslesen die IPs anpingen willst. Wenn nicht, solltest du die auch noch zwischenspeichern. In einer Liste, oder wenn du vorher genau weißt wie viele IPs es sind, geht auch ein Array.

1 IP pro Zeile, durch nichts getrennt (außer Zeilenumbruch).

Wie viele IP´s es werden weiß ich leider nicht :/

Ich soll später das Programm auf einen ServerManager laufen lassen, aber mir geht´s erst einmal darum das ganze irgendwie zu verstehen...

Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei dem Aufbau der Datei solltest du dir am besten mal den BufferedReader anschauen, der stellt die Methode readLine() zur Verfügung. Diese Methode liest, bei dir aus der Datei, immer jeweils eine Zeile aus und gibt sie zurück. In deinem Fall würde die Methode bei jedem Aufruf die nächste IP zurück liefern.

Und entweder du pingst diese IPs dann direkt beim Einlesen an oder du speicherst sie erstmal zwischen. Dafür solltest du dir dann mal Listen anschauen, zum Beispiel die ArrayList.

Möglichkeiten IPs anzupingen hat dir Sporticus ja schon genannt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hey,

nun du wilst ja aus er txt datei ips auslesen und dann anpingen.

ich würd an deiner stelle so vorgehn:

1. txt-datei öffnen mit der klasse randomaccessfile <-- die beste um rnd zugriff auf die datei zu haben

2. alle zeilen einzeln in eine generischen typ zwischenspeichern jeder einttag eine zeile halt

3. string splitten beim . ergebnisse in einem weiteren generischen typ speichern (mehrdimensionales hast dann)

4. Sockets öffnen mit der ip, dann anpingen (obs sockets heist oder nicht ka in java)

Aber tu dir selber einen gefallen und öffne nicht für jede zeile die du lesen willst die datei dadurch wird das programm verdammt langsam(ab einer bestimmten anzahl der zeilen die du lesen willst) und tausche im socket die ip einfach aus falls es sockets gibts was normal der fall sein sollte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also ich muss sagen, mit den zwei Lösungen von Dragon und mir ist er schon ganz gut bedient. Er muss die zwei Komponenten dann nur noch zusammenfügen und das wars.

Was du vorschlägst 2K1.INC ist zwar auch möglich, klingt aber erstmal schon recht kompliziert. Und wir wollen das Problem ja nicht komplizierter machen, als es eigentlich ist. Oder?

Wenn man das alles mal kurz zusammen fast, dann sieht das ungefähr so aus:

1. Datei zeilenweise einlesen

2. Strings vom einlesen in einer List abspeichern

3. ProcessBuilder aufrufen mit "ping " + list.get(xy)

und das wars im Grund auch schon

Bearbeitet von Sporticus
Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke nochmals!

Hier mal aktuell mein einlesen Code...der sollte wesentlich besser zu verarbeiten sein.

		public static void main(String [] args){

    		String line;

    		ArrayList<String> array = new ArrayList<String>(); 


    		try{

    			FileReader test = new FileReader("/ip.txt");  //öffnet meine ip.txt Datei 

    			BufferedReader in = new BufferedReader(test); //benutzt den BufferedReader um jede Zeile Einzeln aus zu werten


    			for(int i = 0;(line = in.readLine())!=null; i++){  //bügelt also mit einer Schleife drüber

    				array.add(line); 								//welche solange läuft bis das ende meiner Datei erreicht ist

    				}												//die Ergebnisse werden in array.add(line) gespeichert

    		}

    		catch(IOException e){

    			System.out.println("Pfadangabe Falsch?!");		//falls der Datei-Pfad falsch ist wird hier eine Fehlermeldung ausgegeben

    		}


    		for(int i=0; i < array.size(); i++)					//schleife um zu testen ob der Inhalt angekommen ist

    			System.out.println( array.get( i ) );


Nun muss ich nur noch das mit den Pingen hinbekommen... aber ich glaub das bekomm ich hin...meld mich bald wieder ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ja trotzdem sollte man randomaccessfile nutzen damit kann man sicher besser in der datei bewegen...

mein prinzip weicht nur am ende von eurem ab. Zudem sollte man nicht nur drauf achten das es einfach ist sondern auch performant und jenachdem solche anwendungen werden sehr schnell sehr langsam und es schadet nicht mal neues kennen zu lernen.

ich sagte nie euer vorschlag is falsch oder *******e oder sonst was ich hab ihm nur was andres vorgeschlagen.

Bearbeitet von 2K1.INC
Link zu diesem Kommentar
Auf anderen Seiten teilen

ich sagte nie euer vorschlag is falsch oder *******e oder sonst was ich hab ihm nur was andres vorgeschlagen.

o.O

Ganz ruhig, das hatt nämlich auch keiner von deinem gesagt^^ Ehrlich gesagt habe ich deinen Post noch nicht gesehen zu dem Zeitpunkt!

Link zu diesem Kommentar
Auf anderen Seiten teilen

RandamAccessFile ist sicher bei manchen Sachen die bessere Wahl, der OT möchte aber keinen wahlfreien Zugriff auf die Datei, sondern einfach nur die in der Datei enthaltenen IPs nacheinander auslesen. Ich habe mir die zugrundeliegenden Klassen zwar noch nicht genauestens angeschaut, aber wenn er nur alles noch einander Auslesen will, warum sollte er dann den Overhead mitnehmen den die RandomAccessFile Klasse wahrscheinlich mit sich bringt?

Und ob er dann halt über das OS Ping Kommando die IPs überprüft oder über die Socket Variante, muss sich jetzt der OT überlegen, bzw vielleicht ist das in seiner Aufgabe ja auch vorgegeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

o.O

Ganz ruhig, das hatt nämlich auch keiner von deinem gesagt^^ Ehrlich gesagt habe ich deinen Post noch nicht gesehen zu dem Zeitpunkt!

ich bin ruhig, nur **** lässt es iwie so aggro aussehn.

von overhead kann man nicht reden, weil ja im prinzip egal ist ob du ein objekt von raf oder br hast das ist so minimal das merkt man nicht. Overhead wäer wenn man auf simple sachen mit linq oder sowas drauf geht...

ich hab ihm nur nen vorschlag gemacht das zu nutzen weil mit raf kannst du eig alles machen. ich denk mal die anwendung wird mehr können sollen als nur pingen, weil es würde keinen sinn ergeben in java extra ne anwendung zu schreiben die nur pingt.. sollte dies der fall sein würde er mit sockets den die grundbasis haben worauf er aufbauen kann und mit raf alles abdecken falls sich die datei ändert bzw er mal schreiben muss. wobei er später eig nur die vorhanden socket daten weiter verarbeitet oder raf anders nutzt jedoch müsste er am vorhanden code was pingen angeht nix mehr ändern

Link zu diesem Kommentar
Auf anderen Seiten teilen

3. ProcessBuilder aufrufen mit "ping " + list.get(xy)

Hmm, ich bekomms doch net hin....wie ruf ich die Liste den auf?

ProcessBuilder prozess = new ProcessBuilder(new String[] {"ping", list.get(array(i)) }); 

So geht das iwie nicht <.<

Danke nochmals

Link zu diesem Kommentar
Auf anderen Seiten teilen

also, dein Code sieht ja folgendermaßen aus:

public static void main(String [] args){

    		String line;

    		ArrayList<String> array = new ArrayList<String>(); 


    		try{

    			FileReader test = new FileReader("/ip.txt");  //öffnet meine ip.txt Datei 

    			BufferedReader in = new BufferedReader(test); //benutzt den BufferedReader um jede Zeile Einzeln aus zu werten


    			for(int i = 0;(line = in.readLine())!=null; i++){  //bügelt also mit einer Schleife drüber

    				array.add(line); 								//welche solange läuft bis das ende meiner Datei erreicht ist

    				}												//die Ergebnisse werden in array.add(line) gespeichert

    		}

    		catch(IOException e){

    			System.out.println("Pfadangabe Falsch?!");		//falls der Datei-Pfad falsch ist wird hier eine Fehlermeldung ausgegeben

    		}


    		for(int i=0; i < array.size(); i++) {					//schleife um zu testen ob der Inhalt angekommen ist

    			[COLOR="seagreen"]// Deinen Code hier einsetzen und die Variable 'list' durch 'array' ersetzen[/COLOR]

    			ProcessBuilder prozess = new ProcessBuilder(new String[] {"ping", [COLOR="red"]array[/COLOR].get(i) });

    			[COLOR="seagreen"]// TODO ProcessBuilder starten und InputStream anzapfen[/COLOR]

    			System.out.println( array.get( i ) );

    		}

Du kannst ja schließlich nicht auf die Variable 'list' zugreifen, wenn es die gar nicht gibt. Die musst du schon durch die Variable ersetzen, wie du deine List benannt hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

also, dein Code sieht ja folgendermaßen aus:

public static void main(String [] args){

    		String line;

    		ArrayList<String> array = new ArrayList<String>(); 


    		try{

    			FileReader test = new FileReader("/ip.txt");  //öffnet meine ip.txt Datei 

    			BufferedReader in = new BufferedReader(test); //benutzt den BufferedReader um jede Zeile Einzeln aus zu werten


    			for(int i = 0;(line = in.readLine())!=null; i++){  //bügelt also mit einer Schleife drüber

    				array.add(line); 								//welche solange läuft bis das ende meiner Datei erreicht ist

    				}												//die Ergebnisse werden in array.add(line) gespeichert

    		}

    		catch(IOException e){

    			System.out.println("Pfadangabe Falsch?!");		//falls der Datei-Pfad falsch ist wird hier eine Fehlermeldung ausgegeben

    		}


    		for(int i=0; i < array.size(); i++) {					//schleife um zu testen ob der Inhalt angekommen ist

    			[COLOR="seagreen"]// Deinen Code hier einsetzen und die Variable 'list' durch 'array' ersetzen[/COLOR]

    			ProcessBuilder prozess = new ProcessBuilder(new String[] {"ping", [COLOR="red"]array[/COLOR].get(i) });

    			[COLOR="seagreen"]// TODO ProcessBuilder starten und InputStream anzapfen[/COLOR]

    			System.out.println( array.get( i ) );

    		}

Du kannst ja schließlich nicht auf die Variable 'list' zugreifen, wenn es die gar nicht gibt. Die musst du schon durch die Variable ersetzen, wie du deine List benannt hast.

perfekt! Tausend Dank, funktioniert einwandfrei :)

Ich mach mich nun die Tage an die nächste Baustelle und werd wohl sicherlich wieder eure Hilfe benötigen... Danke nochmals!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du weißt aber hoffentlich, dass du zwar damit das Ping Kommando aufrufst, aber noch nicht auswertest ob der Ping nun erfolgreich durchgeführt wurde, oder nicht? ;)

hehe, jap, habe ich auch gemerkt :)

Was würdest du den machen ? Also wie fängt man Keine ServerAntworten auf?

grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum einen musst du den Prozess erstmal starten. Bisher hast du dir nur einen ProcessBuilder erstellt mit dem man dann die Prozesse starten kann. Wenn du auf deinem ProcessBuilder die Methode start() aufrufst, wird der Prozess erst gestartet und die Methode gibt dir ein Process Objekt zurück.

Das Objekt stellt dir dann verschiedenen Methoden bereit um die Ausgabe und den Rückgabewert des Kommandos auszuwerten.

Ich weiß gerade nicht, ob das ping Kommando ein Fehlercode zurückliefert wenn es das Ziel nicht erfolgreich pingen konnte. Wenn ja, reicht dir die Methode exitValue(), wenn der Wert > 0 ist, war das Kommando nicht erfolgreich. Ansonsten musst du die Ausgabe auswerten über das Kommando getInputStream().

Link zu diesem Kommentar
Auf anderen Seiten teilen

Heyho!

Funktioniert schonmal ganz gut:


			ProcessBuilder prozess = new ProcessBuilder(new String[] {"ping", array.get(i) });

			// TODO ProcessBuilder starten und InputStream anzapfen


			Process process = prozess.start();

			BufferedReader bufferedReader = new BufferedReader(

	        new InputStreamReader(process.getInputStream()));

	        String line1;

	        try {

				while ((line1 = bufferedReader.readLine()) != null) {

				    System.out.println(line1);

				}

			} catch (IOException e) {

				e.printStackTrace();

			}

	        bufferedReader.close();


			System.out.println( array.get( i ) );

nun Pingt er es einwandfrei an. Nun versteh ich nur net wie ich die Exceptions richtig abfange?

Eigentlich besteht da folgende Aufgabe dahinter;

Das Programm pingt eine Liste mit IP Adresse der Reihe nach an.

Ist die IP Adresse NICHT erreichbar -> ignorieren und nächste IP anfragen

---------------------------------------------------------------------------

Ist IP erreichbar -> schauen ob Port 47711

Wenn nicht -> Port == 135 oder 445?

wenn ja -> als Windows makieren & ausgeben(später in Swing)

wenn nicht -> angeben (ip + port)

---------------------------------------------------------------------------

Ist Port 47711 -> information vergessen

---------------------------------------------------------------------------

möglichkeit IP Adressen für die Zukunft zu verbergen / ignorieren

Ich zermürbe mir echt schon ein paar Tage den Kopf.... Ich hoffe ihr könnt mir mal wieder helfen :)

Danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach du sollst danach auch noch Ports auf Verfügbarkeit überprüfen?

Dann solltest du dir vielleicht doch noch überlegen, dass vielleicht lieber direkt in Java über Sockets zu überprüfen. Ansonsten müsstest du jetzt noch mehrmals über OS Ebene überprüfen ob auch noch die entsprechenende Ports auf dem Host offen sind. Dazu musst du dann mehrmals OS Kommandos aufrufen und die dazu passende Ausgabe parsen.

Über Java Mittel könnte man das mit den Klassen Socket, InetSocketAddress und InetAddress lösen.

Genaue Beispiele könnte ich nachher posten ,gerade hab ich noch zu tun ;)

Und was meinst du mit deiner Frage, wie du Exceptions richtig abfängst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...