# Ping über CMD, Umweg über Batch Datei sparen.



## weeego (21. Aug 2009)

Hallo liebe Forum-User,

ich habe jetzt schon stundenlang das Netz durchstöbert und auch eure Forensuche benutzt, doch leider habe ich nicht die passende Lösung gefunden.

Ich versuche in einem JAVA-Programm ein PING-Befehl abzusetzen. Das gelingt mir bisher auf verschiedene Weisen, aber nicht so, wie ich mir das wünsche 

Hier der Quellcode(das wichtige Teilstück):


```
public void actionPerformed(ActionEvent e)
{
  if (e.getSource() == button1)
    {
     try {
        Process child;
        String[] cmds = new String[]{"cmd", "/C",  "start D:\\Programme\\IP\\ping1.bat\""};
        child = Runtime.getRuntime().exec(cmds);
     }

      catch (IOException f) {
        f.printStackTrace();
      }
        }

} // Ende actionPerformed
```

Inhalt der BATCH-Datei:


```
@echo off

ping 192.168.1.1 -t
```


So der Status Quo....ich drücke also auf einen Button, der öffnet die .bat und diese öffnet ein CMD-Fenster, welches den PING ausführt. Ich finde das mehr als umständlich  Kann ich nicht direkt aus JAVA ein CMD aufrufen und dort einen belibiegen PING-Befehl absetzen?

So hätte man dann die Möglichkeit ein Eingabefeld zu erstellen, in die man die IP einträgt und dann an diese Adresse ein PING gestartet wird.

Wäre toll, wenn ihr mir helfen könnten!
Einen schönen Tag.


----------



## tuxedo (21. Aug 2009)

Geht's dir um einen "echten" Ping?

Wenn du sicher weißt dass dein gegenüber einen Port offen hat kannst du auch das hier benutzen:

http://www.java-forum.org/netzwerkprogrammierung/45203-inetadress-isreachable-unzuverlaessig.html

Damit kriegst du, wenn der POrt erreichbar ist, vergleichbare Werte wie mit dem echten Ping.

- Alex


----------



## weeego (21. Aug 2009)

Danke für die schnelle Antwort.

Aber genrell würde ich einen "echten" PING dem InetAdress->isreachable() vorziehen. Das Progrämmchen wird nur unter Windows eingesetzt, deswegen ist die Plattformunabhängigkeit nicht so ein Thema^^


----------



## sparrow (21. Aug 2009)

Du kannst das was der PING-Befehl macht natürlich auch in Java direkt schreiben.
Das wärst du sogar unabhängig von Windows.


----------



## tuxedo (21. Aug 2009)

Ping setzt aber unterhalb von TCP und UDP an (ICMP). Und in Java hat man da keinen direkten Zugriff. Ergo geht es nicht ohne JNI und Co. 

Aber meine Beispielimplementierung am Ende des verlinkten Beitrags kommt dem Endergebnis schon ziemlich nahe. Konnte, sofern ein bekannter, offener Port da war keine signifikanten Zeitunterschiede zwischen meinem Ping-Ergebnis und einem richtigen Ping feststellen.

- Alex


----------



## ARadauer (21. Aug 2009)

```
String cmd = "cmd /c ping 192.168.1.1 -t";
		      Process p = Runtime.getRuntime().exec(cmd);

		      InputStream is =  p.getInputStream();
		      BufferedReader b = new BufferedReader(new InputStreamReader(is));
		      String line = null;
		      while((line = b.readLine())!= null){
		         System.out.println(line);        
		      }
```
warum nicht einfach so?


----------



## weeego (21. Aug 2009)

ARadauer hat gesagt.:


> ```
> String cmd = "cmd /c ping 192.168.1.1 -t";
> Process p = Runtime.getRuntime().exec(cmd);
> 
> ...



So eine ähnliche Lösung hatte ich auch schon...allerdings, hätte ich die ausgabe des in JAVA aufgerufenen PING-Befehls gerne wirklich in dem CMD-Prompt und nicht über System.out.println();

Ist das möglich?


----------



## SlaterB (21. Aug 2009)

eine graphische Oberfläche mit JTextArea usw. ist dir nicht gelegen?


----------



## weeego (21. Aug 2009)

http://www.dpunkt.de/java/Programmieren_mit_Java/Oberflaechenprogrammierung/58.html

das klingt eigentlich gar nicht schlecht..ich versuche das mal einzubauen^^


----------



## weeego (21. Aug 2009)

```
try {
        String cmd = "cmd /c ping 192.168.1.1 -t";
              Process p = Runtime.getRuntime().exec(cmd);

              InputStream is =  p.getInputStream();
              BufferedReader b = new BufferedReader(new InputStreamReader(is));
              String line = null;
              while((line = b.readLine())!= null){
              
              JTextArea tA = new JTextArea(4, 20);
              tA.setEditable(false);
              add (new JScrollPane(tA));
              tA.append("Test, Test");
              tA.setCaretPosition(0);

              }

     }
```

Leider passiert wenn ich jetzt auf den Button drücke gar nichts. Woran liegt das?


----------



## ARadauer (21. Aug 2009)

> und diese öffnet ein CMD-Fenster, welches den PING ausführt. Ich finde das mehr als umständlich





> gerne wirklich in dem CMD-Prompt und nicht über System.out.println();


was jetzt? Was willst du mit dem Text machen?


----------



## weeego (21. Aug 2009)

Am liebsten wäre mir eine wenn der PING dann ganz normal in dem CMD-Prompt angezeigt wird. 

Auf gar keinen Fall will ich eine Ausgabe in der Konsole.

Und für alternative Möglichkeiten (wie z.B. JTextArea) bin ich offen.


----------



## Atze (21. Aug 2009)

was ist denn hier der unterschied zwischen cmd-promt und konsole? (wir reden hier nicht von der eclipse console, oder?)


----------



## weeego (21. Aug 2009)

Konsole -> das im JavEditor
CMD-Prompt -> das von Windows

Entschuldige, dass ich mich nich ganz eindeutig ausgedrückt habe.


----------



## Atze (21. Aug 2009)

wenn du das programm über die cmd startest, solltest du da doch über sysout die ausgabe auf der cmd haben


----------



## tuxedo (21. Aug 2009)

Ich denke er will, dass wenn er den ping startet, eine "Dosbox" aufgeht in der der Pipng ausgeführt wird. Das hat er bis jetzt schon mit seinem ersten Versuch erreicht, allerdings nur über den "Umweg" mit den Batch-File.

Der Weg/Ansatz war also schon richtig, nur hat die Befehlsfolge die an Runtime übergeben wird nicht gepasst.

Tipp:

Mach ne Dosbox auf und versuche dort den Befehl zu finden mit dem der Ping in einer separaten Dosbox ausgeführt wird. Und das führst du dann in Java aus.

- Alex


----------



## Atze (21. Aug 2009)

ahso


----------



## weeego (21. Aug 2009)

genau! 

danke...du hast mich super übersetzt! ich werds mal probieren!


----------

