如何通过Socket找到HTTP请求的响应时间

时间:2008-09-16 02:46:46

标签: java http

我正在使用连接到服务器的Java套接字。 如果我发送HEADER http请求,如何测量服务器的响应时间?我必须使用提供的java计时器,还是有更简单的方法?

我正在寻找一个简短的答案,我不想使用其他协议等。显然我不想要一个将我的应用程序与特定操作系统联系起来的解决方案。请人,仅限IN-CODE解决方案。

7 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:12)

您可以在命令行上使用时间和卷曲和时间。 curl的-I参数指示它仅请求标题。

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

答案 2 :(得分:11)

我想说这取决于您尝试测量的确切间隔,从您发送的请求的最后一个字节到您收到的响应的第一个字节的时间量?或者直到收到整个回复?或者您是仅尝试测量服务器端时间?

如果您只是尝试测量服务器端处理时间,那么您将很难计算出您的请求到达的网络传输所花费的时间以及返回的响应。否则,由于您通过套接字自行管理请求,您可以通过检查系统时钟和计算差异来测量任意两个时刻之间的经过时间。例如:

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

此代码将测量从开始写出请求到收到响应的时间,并打印结果(假设您已实现特定的读/写方法)。

答案 3 :(得分:7)

这样的事可能会成功

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

答案 4 :(得分:2)

也许我错过了什么,但你为什么不用它:

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

答案 5 :(得分:0)

使用AOP拦截对套接字的调用并测量响应时间。

答案 6 :(得分:0)

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

这样,您可以独立于网络速度来计算服务的实际响应时间。