# Ping unter Java



## auxilium (9. Aug 2008)

hallo,

ich möchte die pingzeit zu verschiedenen hosts bestimmen. Bei der Recherche im Internet bin ich dabei auf 2 verschiedene Möglichkeiten gestossen:


```
public class Ping {

	public static void main(String[] args) {

		
		String pingResult = "";

		String pingCmd = "ping " + "www.google.de";

		try {
			ProcessBuilder pb = new ProcessBuilder("ping", "www.google.de");
			
			
		//Runtime r = Runtime.getRuntime();
		//Process p = r.exec(pingCmd);
			Process p = pb.start();

		BufferedReader in = new BufferedReader(new
		InputStreamReader(p.getInputStream()));
		String inputLine;
		while ((inputLine = in.readLine()) != null) {
		System.out.println(inputLine);
		pingResult += inputLine;
		}
		in.close();

		}//try
		catch (IOException e) {
		System.out.println(e);
		}

		}

		}
```

entweder lässt man das über das betriebssystem über den ProcessBuilder ausführen oder oder über die Runtime
Wo liegen da genau die Unterschiede?



Weiterhin möchte ich gerne die durchschnittliche Pingzeit bestimmen, im prinzip bleibt da doch nichts anderes übrig, als den Stream entsprechend zu durchsuchen?

Bei erfolgreichem Pingen ergibt die letzte Zeile:
Minimum = 13ms, Maximum = 28ms, Mittelwert = 23ms

Das Problem ist nun, wenn das Programm dann auf einem französischen Windows XP läuft, dass dann der Mittelwert, nicht mehr unter dem Namen Mittelwert zu finden ist.
Hat jemand eine Idee, wie ich dennoch die durschnittliche Pingzeit bestimmen kann?


----------



## tuxedo (10. Aug 2008)

Wenn du weißt, dass auf dem Zielsystem ein bestimmter POrt offen ist, dann kannst du etwas ping-ähnliches machen:

Öffne eine Socketverbindung zu dem Zielsystem und schließe sie sofort wieder (ohne ein Zeichen zu senden). Die Zeit, die dieser vorgang benötigt, entspricht ziemlich genau der Zeit, die ein Ping auch benötigen würde.

Das native ping-tool zu benutzen ist, wie du schon festgestellt hast, nicht ohne weitere Probleme möglich. Zum einen gibts localization probleme, zum anderen: Was machst du wenn einer dein programm mit Mac oder Linux laufen lassen will?

Fazit: Ping mit Java ist so ne Sache...

- Alex


----------



## auxilium (10. Aug 2008)

ja ist relativ schwer sowas umzusetzen, ich möchte halt pingverlust und pingzeit:


```
long jetzt = System.currentTimeMillis();
Socket testSock = new Socket( "www.google.de", 80 ); 
long dann = System.currentTimeMillis();
System.out.println(dann -jetzt);
```

habe das jetztmal so rudimentär implementiert, jedenfalls ist da die zeit durschnittlich 80 ms , pinge ich unter windows habe ich zeiten von 25.

also so wirklich haut das nicht hin, oder habe ich was falsch gemacht?


----------



## tuxedo (10. Aug 2008)

Vielleicht wirds noch präziser wenn du den Nagle-Algorithmus auf dem Socket ausschaltest bevor du die verbindung aufbaust?!

Ein Ping ist das letztendlich nicht, nur etwas, was dem "Sinn" eines Pings nahekommt.

Wenn du einen wirklichen Ping realisieren willst, wirst du nicht um eine native Implementierung, die du mit JNI einbindest herumkommen. Allerdings musst du dann das ganze für jedes OS auf C/C++ Ebene extra implementieren.

"Echte" Pings sind mit Java alleine eben nicht möglich.

- Alex


----------



## kleiner_held (11. Aug 2008)

Eventuell kannst du auch
InetAddress.isReachable(int timeout)
verwenden.


----------



## tuxedo (11. Aug 2008)

Das Thema hatten wir schonmal: http://www.java-forum.org/de/viewtopic.php?t=47888&highlight=inetaddress+isreachable

Ergebnis: nicht wirklich brauchbar. Hab in dem Thread aber eine etwas "verbesserte" Variante gepostet...


----------

