Java 当我对主机的ping小于1ms时,http GET请求需要1到3秒的时间,这是否正常?

Java 当我对主机的ping小于1ms时,http GET请求需要1到3秒的时间,这是否正常?,java,http,netbeans,okhttp,Java,Http,Netbeans,Okhttp,我正在编写一个java应用程序,它在执行http GET请求时需要非常高效 我正在使用netbeans概要文件特性,它让我可以测量性能,到目前为止,我已经尝试了两个库:java默认库和okhttp 我注意到,对于每个请求,从开始构建url并执行连接到接收响应代码之间需要1到3秒的时间。这不是有点太多了吗?另外,请注意,我的电脑和主机之间的ping少于1毫秒。openConnection()/execute()方法怎么会花这么长时间?这是正常的吗?我怎样才能让它更快 这就是我使用okhttp的方式

我正在编写一个java应用程序,它在执行http GET请求时需要非常高效

我正在使用netbeans概要文件特性,它让我可以测量性能,到目前为止,我已经尝试了两个库:java默认库和okhttp

我注意到,对于每个请求,从开始构建url并执行连接到接收响应代码之间需要1到3秒的时间。这不是有点太多了吗?另外,请注意,我的电脑和主机之间的ping少于1毫秒。openConnection()/execute()方法怎么会花这么长时间?这是正常的吗?我怎样才能让它更快

这就是我使用okhttp的方式。OkHttpClient客户端仅在启动应用程序时创建一次

Request request = new Request.Builder()
                .url(url)
                .build();
        try {
            Response response = client.newCall(request).execute();

            jresp = new JSONObject(response.body().string());

            response.close();            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
这是使用java默认库的版本

try {
            StringBuilder result = new StringBuilder();
            URL url = new URL(buyUrl);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            BufferedReader rd;

            int code = conn.getResponseCode();


            if (code == 200) {
                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            } else {
                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
            }

            String line;
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }
            rd.close();

            jresp = new JSONObject(result.toString());

        } catch (Exception ex) {
            ex.printStackTrace();
        }
正如我所说,这两种方法平均需要相同的时间,在1000到3000毫秒之间,使用或使用Zipkin之类的库实现跟踪,以了解为什么在所有级别都需要时间

如果无法访问您的网络或服务器,我无法详细回答您的具体情况

这是一个示例OkHttp请求

它慢的原因

  • 包括从http到https的重定向
  • 进行两次DNS查找(可能会慢得多)
  • 创建两个TCP套接字(与我们连接到的位置相关)
  • 1 TLS握手吗
  • 谷歌从重定向到
  • 传输响应数据速度慢(4x)
你可以做些什么来加速这个特殊的请求

  • 知道第一次击中终点
  • 重用现有的HTTP/2连接

这完全取决于您如何处理请求。请发布您的代码。这还取决于服务器需要做什么来生成响应。如果服务器速度慢,你就什么也做不了。我建议使用Curl和/或WireShark之类的工具来跟踪请求。如果这是服务器端的问题,您就无能为力了。您可以有一个快速的ping时间,但服务器可能正在执行一个缓慢的查询。我看到服务器需要几分钟来响应get请求!您还可以在代码中添加一些带有时间戳的日志记录,以查看到底是什么花费了这么长的时间。这有太多不同的可能性和原因,因此对于这个站点来说太广泛了。原始帖子中添加的代码我已经尝试过了,但当我单击“查找跟踪”时,它什么也没有显示。这只是一个示例,如果你想使用Zipkin,你需要实现你自己的跟踪,例如,打印事件可能更简单,例如,EventListener非常有用,并且易于使用。第一次连接比其他连接需要更多的时间,因为需要握手。其他的仍然需要至少一秒钟,但这是因为服务器需要一些时间来发送响应体(即使响应体相对较小)。connectionAcquired和requestHeaders回调在几毫秒内执行,因此我的问题得到了解决。非常感谢您的帮助。最后一件事,如果在一定时间内(比如5分钟)没有任何请求,那么发出的第一个请求需要大约100毫秒才能获得连接。如果在这个请求之后很快又有另一个请求,那么一切都会回到“正常”状态,并在2-3毫秒内获得连接。我如何确保连接始终在3毫秒内建立?我是否应该执行中间请求,即使不是为了使连接保持活动状态?