¿Cómo puedo encontrar el tiempo de respuesta de una solicitud HTTP a través de un Socket?

StackOverflow https://stackoverflow.com/questions/68999

  •  09-06-2019
  •  | 
  •  

Pregunta

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 utilizar un temporizador Java proporcionado o hay una manera más sencilla?

Estoy buscando una respuesta breve, 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 gente, solo soluciones IN-CODE.

¿Fue útil?

Solución

Yo diría que depende del intervalo exacto que 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 recibe?¿O hasta que se reciba la respuesta completa?¿O está intentando medir únicamente el tiempo del lado del servidor?

Si está intentando medir únicamente el tiempo de procesamiento del lado del servidor, le resultará difícil calcular la cantidad de tiempo empleado en el tránsito de la red para que llegue su solicitud y regrese la respuesta.De lo contrario, dado que usted mismo administra la solicitud a través de un Socket, puede medir el tiempo transcurrido entre dos momentos cualesquiera verificando el reloj del sistema y calculando 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 que comienza a escribir su solicitud hasta que termina de recibir la respuesta e imprimiría el resultado (suponiendo que haya implementado sus métodos específicos de lectura/escritura).

Otros consejos

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

Puede usar time, curl y time en la línea de comandos.El argumento -I para curl le indica que solo solicite el encabezado.

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

Algo como esto podría funcionar

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

Tal vez me esté perdiendo algo, pero ¿por qué no usas simplemente:

// 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");

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

@Aspect
@Profile("performance")
@Component
public class MethodsExecutionPerformance {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Pointcut("execution(* it.test.microservice.myService.service.*.*(..))")
    public void serviceMethods() {
    }

    @Around("serviceMethods()")
    public Object monitorPerformance(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch(getClass().getName());
        stopWatch.start();
        Object output = proceedingJoinPoint.proceed();
        stopWatch.stop();
        logger.info("Method execution time\n{}", stopWatch.prettyPrint());
        return output;
    }
}

De esta forma, podrás calcular el tiempo de respuesta real de tu servicio independientemente de la velocidad de la red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top