4 Stimmen

Wie misst man die Antwortzeit des Netzwerks mit Java?

Wir haben einen Client und einen Server. Ich möchte die Reaktionszeit des Netzwerks zwischen ihnen messen. Wenn ich eine Anfrage an den Server sende, sollte er sofort auf meine Anfrage antworten, es sollte wie eine Ping-Anfrage sein, sodass keine Verarbeitungszeit auf dem Server stattfindet.

Wie kann ich das in Java machen?

2voto

Eddie Punkte 52504

Ich habe dies gemacht, indem ich ein Paket mit einem Zeitstempel vom Client an den Server gesendet habe und dann den Server den gleichen Zeitstempel zurückgeben lassen habe. Wenn der Server den Zeitstempel empfängt, kann er ihn mit dem aktuellen Zeitstempel vergleichen, um die Round-Trip-Zeit zu messen.

Anscheinend gibt es einen Weg, um einen ICMP-Ping in Java 5 und später zu generieren. Wenn Sie Netzwerkgeschwindigkeiten messen möchten, erfassen Sie einfach System.nanoTime() vorher und nachher und vergleichen Sie sie. Beachten Sie, dass, wenn Ihr Programm nicht über ausreichende Berechtigungen verfügt, um einen ICMP-Ping auszuführen, Java auf die Verwendung einer TCP-Echo-Anforderung an Port 7 zurückgreift, was Ihren Anforderungen immer noch entspricht.

0 Stimmen

Aber ich habe keinen Zugriff auf den Server, ich kann nur die Client-Anwendung ändern.

0 Stimmen

Wenn Sie keinen Zugriff auf den Server haben, gibt es dann etwas auf dem Server, das Sie verwenden können, um dem Client etwas zurückzugeben, das er verfolgen kann?

0 Stimmen

Ich habe auch keinen Zugriff auf den Server und die Serveradresse wird jedes Mal anders sein. Daher haben wir nur den Client, mit dem wir interagieren können und den wir modifizieren können.

1voto

soulmerge Punkte 70900

Um sicherzustellen, dass die Serverantwort so schnell wie möglich erfolgt, sollten Sie entweder

  1. über eine zweite Verbindung zu einem anderen Port verfügen – dies ist nützlich, wenn Sie die Route zum Server testen möchten, d.h. die Leitungen – oder
  2. einen gemeinsamen Thread für alle eingehenden Pakete haben, der entscheidet, ob ein eingehendes Paket eine Ping-Anfrage ist und sofort antwortet – was nützlich ist, wenn Sie die aktuelle Verbindung testen möchten (die andere Pakete auf dieser Verbindung berücksichtigt).

In jedem Fall sollte der Empfangsteil (Server) seinen eigenen Thread haben, da die Bearbeitung der Anfrage sonst hängen bleiben könnte, während andere Pakete verarbeitet werden.

Beachten Sie, dass, egal was Sie tun, um die Geschwindigkeit der Verbindung zu messen, Sie keinen zuverlässigen Wert haben werden. Sie sollten jedoch einen akzeptablen Wert haben, wenn Sie den Durchschnitt mehrerer solcher Pings nehmen.

1voto

Brian Agnew Punkte 260470

Ich denke, du musst unterscheiden zwischen der Zeit, die der Server (die Maschine) benötigt, und der Zeit, die dein Server-seitiger Prozess benötigt, um dies zu verarbeiten. Zum Beispiel wird ping einfach die ICMP-Antwortzeit messen, was eine Low-Level-Netzwerkprotokollrückgabe ist. Wenn du den TCP-Stack berücksichtigst und dann die anschließende Verarbeitung durch den Server, wird dieser Zeitraum größer sein.

Aus deiner Frage klingt es so, als ob du ping (ICMP) möchtest. In JDK 5 und höher kannst du folgendes tun:

String host = "192.168.0.1"
int timeOut = 5000; 
boolean status = InetAddress.getByName(host).isReachable(timeOut)

und du müsstest das mit System.nano() oder ähnlichem messen.

0 Stimmen

Vielen Dank für Ihre Hilfe. Aber wie können wir die Reaktionszeit mit dieser Methode messen, da sie nur einen booleschen Wert zurückgibt. Bitte helfen Sie.

0 Stimmen

Holen Sie sich die Anzahl der Nanosekunden, bevor Sie es aufrufen. Rufen Sie es dann auf. Holen Sie sich dann die Anzahl der Nanosekunden danach. Ziehen Sie das eine vom anderen ab und Sie haben die Zeitspanne.

0 Stimmen

Ya, ich habe dasselbe gemacht, aber es stimmt nicht mit der Ping-Anfrage überein. Bei der Ping-Anfrage habe ich 5 Millisekunden erhalten, während ich für dieselbe IP-Adresse mit unserem Code 1024 Millisekunden erhalten habe. Ich glaube, es ist nicht zuverlässig. Wenn Sie helfen können, wäre ich dankbar.

0voto

Cassio Punkte 1

Die Verwendung von Ping sollte ausreichen oder wget, um die Übertragungsrate zu verfolgen. Sie können justniffer nutzen, um die Antwortzeiten von "produktions"-Servern zu sniffen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X