# TraceRoute mit Java?



## Gast (5. Jul 2006)

Hat einer ne Ahnung ob es inzwischen möglich ist ohne JNI, ein TraceRouteTool mit Java zu schreiben.
 Soviel ich weis geht das mit dem IMCP-Dienst.
 Kann mir jemand sicher sagen ob das geht oder nicht.

 Danke....


----------



## Beni (5. Jul 2006)

Die Methode "Runtime.exec" kann so ziemlich alles starten, was man über die Konsole starten könnte. Vergiss nicht, die Streams des Process-Objektes abzuhören :wink:


----------



## Gast (5. Jul 2006)

Beschreib mal bitte genauer, was du meinst, arbeite unter WinXP
was meinst du soll ich mit Runtime.exec starten?


----------



## L-ectron-X (5. Jul 2006)

Das Systemprogramm tracert.exe (Trace Route)


----------



## The_S (5. Jul 2006)

das du den Windows-Eigenen Trace verwenden kannst mit Runtime.getRuntime().exec("cmd /c tracert") und dann über die Klasse Process dir die Ausgabe in dein Programm laden kannst.


----------



## Gast (5. Jul 2006)

oh das sieht ja schonmal sehr toll aus, vielen Dank...
An die processstreams? wie kommt man da am besten ran?
Aber kommt mir erstmal schwierig vor? oder nicht?

Danke


----------



## Gast (5. Jul 2006)

Ihr seid auf jedenfall super, ich wär nicht drauf gekommen, das so zu lösen...


----------



## Beni (5. Jul 2006)

exec gibt ein Process-Objekt zurück. Die Process-Klasse wiederum hat eine Methode "getInputStream". Und in diesem Stream wird tracerout seinen Output schreiben (deshalb heisst er InputStream - von der anderen Seite aus betrachtet).
Mit der Methode "read" kannst du wiederum einzelne bytes aus dem Stream lesen, und mit einem Cast du "char" hast du einen Buchstaben. -> eine kleine Schleife rund um "read" machen.


----------



## The_S (5. Jul 2006)

Process p = Runtime.getRuntime().exec("cmd /c tracert");
p.getInputStream();



edit: schon wieder zu langsam  :x


----------



## Gast (5. Jul 2006)

oh ja danke, habe auch gerade in der APIDoc nachgesehen und dies entdeckt...
Auf jedenfall vielmals danke...


----------



## Gast (5. Jul 2006)

```
public class MainProg {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String result = "";
		Process p;
		byte[] stream = new byte[256];
		try{
		p = Runtime.getRuntime().exec("cmd /c tracert.exe www.google.de");
		while(true){
		p.getInputStream().read(stream);
		}
	
		} catch(Exception e){
			System.out.println(e.toString());
		}
	
	}

}
```
hier sehe ich leider nichts, ich brauch wohl schon wieder hilfe...
keine erfahrung damit...
Was habe ich falsch gemacht? (google nur testweise)

danke..


----------



## Beni (5. Jul 2006)

```
public class MainProg {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String result = "";
		Process p;

		try{
		p = Runtime.getRuntime().exec("cmd /c tracert.exe www.google.de");
		while(true){
			char c = (char)p.getInputStream().read();
			System.out.println( c );    // Ausgeben muss man das Ding noch
		}
	
		} catch(Exception e){
			e.printStackTrace();
		}
	
	}

}
```


----------



## Gast (5. Jul 2006)

müsste nicht auch das Kommandozeilenfenster aufgehen, passiert auch nicht...


----------



## Gast (5. Jul 2006)

oh danke...


----------



## Gast (5. Jul 2006)

leider alles fehlerhafte Zeichen, obwohl es ja eigendlich geht von Integer nach char zu casten und kein Blödsinn zu bekommen...
In einen Stringbuffer geschissen bekomme ich outofmemory..

Danke


----------



## Beni (5. Jul 2006)

Mein Fehler...

```
public class MainProg {

   /**
    * @param args
    */
   public static void main(String[] args) {
      // TODO Auto-generated method stub
      String result = "";
      Process p;

      try{
      p = Runtime.getRuntime().exec("cmd /c tracert.exe www.google.de");
      int read = p.getInputStream().read();
      while( read != -1 ){
         char c = (char)read;
         read = p.getInputStream().read();
         System.out.print( c );    // Ausgeben muss man das Ding noch
      }
   
      } catch(Exception e){
         e.printStackTrace();
      }
   
   }

}
```


----------



## Gast (5. Jul 2006)

oh ich eine geschmissen... Sorry...


----------



## Gast (5. Jul 2006)

es funktioniert, vielmals Danke...


----------



## Gast (5. Jul 2006)

so ists wie ichs wollte, jetzt passt es in eine GUI.. Danke...


```
public class MainProg {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Process p=null;
		int i;

		StringBuffer sbuffer = new StringBuffer();
		try{
		p = Runtime.getRuntime().exec("cmd /c tracert.exe www.google.de");
		System.out.println("in Progress..");
		while((i = p.getInputStream().read() ) != -1){
	         sbuffer.append((char)i);
		
		} 
		
	
		} catch(Exception e){
			System.out.println(e.toString());
		}
		System.out.println(sbuffer);
		System.out.println("ready..");
	
	}

}
```

nochmals vielen Dank!!


----------



## The_S (6. Jul 2006)

Also bei mir funzt es wunderbar, ich würde aber statt ein out.println nur ein out.print verwenden, da die Ausgabe sonst recht unübersichtlich ist 

[edit] ach mist, da habsch doch tatsächlich übersehen, dass der Thread über 2 Seiten geht


----------

