2008-09-16 4 views
19

J'utilise un socket Java, connecté à un serveur. Si j'envoie une requête HTTP HEADER, comment puis-je mesurer le temps de réponse du serveur? Dois-je utiliser une minuterie java fournie, ou y a-t-il un moyen plus facile?Comment puis-je trouver le temps de réponse d'une requête HTTP via un socket?

Je cherche une réponse courte, je ne veux pas utiliser d'autres protocoles, etc. Évidemment, je ne veux ni d'avoir une solution qui lie mon application à un système d'exploitation spécifique. S'il vous plaît les gens, les solutions IN-CODE seulement.

+0

À des fins de débogage ou pour votre programme? – owenmarshall

Répondre

12

je dirais cela dépend de l'intervalle exact que vous essayez de mesurer, de la durée écoulée depuis le dernier octet de la requête que vous envoyez jusqu'au premier octet de la réponse vous recevez? Ou jusqu'à ce que toute la réponse soit reçue? Ou essayez-vous de mesurer l'heure côté serveur uniquement?

Si vous essayez de mesurer le temps de traitement côté serveur seulement, vous allez avoir du mal à prendre en compte le temps passé en transit réseau pour que votre demande arrive et la réponse à renvoyer. Sinon, puisque vous gérez la demande vous-même via un socket, vous pouvez mesurer le temps écoulé entre deux moments en vérifiant l'horloge du système et en calculant la différence. Par exemple:

public void sendHttpRequest(byte[] requestData, Socket connection) { 
    long startTime = System.currentTimeMillis(); 
    writeYourRequestData(connection.getOutputStream(), requestData); 
    byte[] responseData = readYourResponseData(connection.getInputStream()); 
    long elapsedTime = System.currentTimeMillis() - startTime; 
    System.out.println("Total elapsed http request/response time in milliseconds: " + elapsedTime); 
} 

Ce code mesurer le temps entre le moment où vous commencez à écrire votre demande lorsque vous avez fini de recevoir la réponse et imprimer le résultat (en supposant que vous avez vos méthodes de lecture/écriture spécifiques mises en œuvre).

+1

où puis-je ajouter cette fonction ?? dans mon service web? –

12

Vous pouvez utiliser le temps et boucle et l'heure sur la ligne de commande. L'argument -I de curl lui indique de ne demander que l'en-tête.

time curl -I 'http://server:3000' 
7

Quelque chose comme cela pourrait faire l'affaire

 
import java.io.IOException; 

import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpMethod; 
import org.apache.commons.httpclient.URIException; 
import org.apache.commons.httpclient.methods.HeadMethod; 
import org.apache.commons.lang.time.StopWatch; 
//import org.apache.commons.lang3.time.StopWatch 

public class Main { 

    public static void main(String[] args) throws URIException { 
     StopWatch watch = new StopWatch(); 
     HttpClient client = new HttpClient(); 
     HttpMethod method = new HeadMethod("http://stackoverflow.com/"); 

     try { 
      watch.start(); 
      client.executeMethod(method); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      watch.stop(); 
     } 

     System.out.println(String.format("%s %s %d: %s", method.getName(), method.getURI(), method.getStatusCode(), watch.toString())); 

    } 
} 
 
HEAD http://stackoverflow.com/ 200: 0:00:00.404 
2

Peut-être que je manque quelque chose, mais pourquoi ne pas utiliser simplement:

// open your connection 
long start = System.currentTimeMillis(); 
// send request, wait for response (the simple socket calls are all blocking) 
long end = System.currentTimeMillis(); 
System.out.println("Round trip response time = " + (end-start) + " millis"); 
0

Utilisez AOP pour intercepter les appels à la prise et mesurer le temps de réponse.

19

curl -s -w "%{time_total}\n" -o /dev/null http://server:3000

Questions connexes