如何通过套接字找到HTTP请求的响应时间

时间:2020-03-05 18:55:02  来源:igfitidea点击:

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

我正在寻找一个简短的答案,我不想使用其他协议等。显然,我也不想拥有一个将我的应用程序绑定到特定OS的解决方案。拜托大家,仅IN-CODE解决方案。

解决方案

回答

我们可以在命令行上使用时间以及时间和时间。 curl的-I参数指示它仅请求标头。

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

回答

这样的事情可能会解决问题

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

回答

也许我缺少了一些东西,但是为什么不使用:

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

回答

我要说的是,这取决于我们尝试测量的确切间隔,即从发送请求的最后一个字节到收到响应的第一个字节所花费的时间?还是直到收到整个答复?还是我们只想衡量服务器端时间?

如果我们只想衡量服务器端的处理时间,那么将很难计算出要请求到达和返回响应所花费的网络传输时间。否则,由于我们是通过Socket自己管理请求,因此可以通过检查系统时钟并计算差来测量任意两个时刻之间的经过时间。例如:

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

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

回答

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