2008-09-16 48 views
19

Estoy usando un socket Java, conectado a un servidor. Si envío una solicitud http HEADER, ¿cómo puedo medir el tiempo de respuesta del servidor? ¿Debo usar un temporizador Java provisto, o hay una manera más fácil?¿Cómo puedo encontrar el tiempo de respuesta de una solicitud HTTP a través de un socket?

Estoy buscando una respuesta corta, no quiero utilizar otros protocolos, etc. Obviamente, tampoco quiero tener una solución que vincule mi aplicación a un sistema operativo específico. Por favor, personas, soluciones IN-CODE solamente.

+0

Para propósitos de depuración, o para uso de su programa? – owenmarshall

Respuesta

12

diría depende de qué intervalo exacto está intentando medir, la cantidad de tiempo desde el último byte de la solicitud que envía hasta el primer byte de la respuesta que ¿recibes? O hasta que se reciba toda la respuesta? ¿O está tratando de medir el tiempo del lado del servidor solamente?

Si está tratando de medir solo el tiempo de procesamiento del lado del servidor, tendrá dificultades para calcular la cantidad de tiempo que pasa en el tránsito de la red para que su solicitud llegue y la respuesta vuelva. De lo contrario, dado que usted está administrando la solicitud usted mismo a través de un Socket, puede medir el tiempo transcurrido entre cada dos momentos al verificar el reloj del Sistema y calcular la diferencia. Por ejemplo:

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); 
} 

Este código mediría el tiempo desde el momento de comenzar a escribir su solicitud para cuando termine de recibir la respuesta, e imprimir el resultado (suponiendo que tiene sus métodos específicos de lectura/escritura en práctica).

+1

¿dónde puedo agregar esta función en mi servicio web? –

12

Puede utilizar el tiempo y el curl y el tiempo en la línea de comandos. El argumento -I para curl indica que solo solicite el encabezado.

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

Algo como esto puede hacer el truco

 
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

Tal vez me falta algo, pero ¿por qué no sólo tiene que utilizar:

// 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

Use AOP para interceptar llamadas al socket y medir el tiempo de respuesta.

19

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

Cuestiones relacionadas