Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 到网页的后续套接字连接需要不同的时间_Java_Sockets_Http_Caching_Server - Fatal编程技术网

Java 到网页的后续套接字连接需要不同的时间

Java 到网页的后续套接字连接需要不同的时间,java,sockets,http,caching,server,Java,Sockets,Http,Caching,Server,我最近一直在问一些问题,希望这将是最后一个问题(至少我回答了其中一个!) 我有以下直接代码,通过套接字连接到网页(这里的参数是buzzfeed.com网站的IP地址): 此代码可以工作并打印buzzfeed.com的HTML源代码。然而,这个程序的第一次调用(我只是一次又一次地启动这个程序),总是要花费两到三倍于后续调用的时间,发生在很短的时间内。例如: 第一次调用(1500毫秒) 秒调用(紧接着)-600毫秒 此调用(紧接第二次调用之后)-400毫秒 然后,如果我等待20秒,我们返回到“第

我最近一直在问一些问题,希望这将是最后一个问题(至少我回答了其中一个!)

我有以下直接代码,通过套接字连接到网页(这里的参数是buzzfeed.com网站的IP地址):

此代码可以工作并打印buzzfeed.com的HTML源代码。然而,这个程序的第一次调用(我只是一次又一次地启动这个程序),总是要花费两到三倍于后续调用的时间,发生在很短的时间内。例如:

  • 第一次调用(1500毫秒)
  • 秒调用(紧接着)-600毫秒
  • 此调用(紧接第二次调用之后)-400毫秒
然后,如果我等待20秒,我们返回到“第一次调用”,连接再次需要大约1500毫秒

我认为这显然是一种缓存的情况——要么在我这边,要么在服务器端。因此,我在代码中添加了以下行:

// don't keep connections alive.
System.setProperty("http.keepAlive", "false");

// do not cache dns.
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
但它不起作用。我是否遗漏了一些属性或解释?我可以用其他一些“setProperty”来统一时间?更好的是,如果这是一个缓存问题,我如何处理这个缓存?究竟缓存了什么?我正在直接连接到IP地址

如果这是一个已知的服务器行为,我也想知道。请注意,这种情况并不总是发生,例如,连接到stackoverflow(104.16.33.249)会产生不同的响应时间(即使在这种情况下,后续响应似乎也要快一点)。它与静态页面和动态页面相关吗?我有点困惑,希望得到任何答案

谢谢

  • 第一次调用(1500毫秒)
  • 秒调用(紧接着)-600毫秒
  • 此调用(紧接第二次调用之后)-400毫秒
然后,如果我等待20秒,我们回到“第一次调用”,然后 再次连接大约需要1500毫秒

您可以从浏览器(F12/网络)中查看HTTP头文件开始,或者使用查看
保持活动-
缓存头文件的实际情况,以及不同的计时

例如,以下是www.buzzfeed.com返回的标题:

Socket s = new Socket("23.34.229.118", 80);
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream writer = new PrintStream(s.getOutputStream());
writer.println("GET / HTTP/1.0\r\nHost: www.buzzfeed.com\r\n");

String line;
while((line = reader.readLine()) != null)
{
    // just read, do nothing. When printed, it print the correct data.
}

s.close();
HTTP/1.1 200 OK
Server: Apache
Content-Type: text/html
X-BuzzFeed: webdr05
Vary: Accept-Encoding
X-BuzzFeed-Debug: /index (bucket testing)
Content-Encoding: gzip
Cache-Control: max-age=29
Date: Sat, 26 Dec 2015 14:37:35 GMT
Transfer-Encoding: chunked
Connection: keep-alive, Transfer-Encoding
例如,请参见
缓存控制:max age=29

如果这是一个已知的服务器行为,我也想知道


但是,时间上的差异也可能是由Web服务器上的缓存引起的。页面或其部分(服务器对此响应使用
分块模式
传输编码:分块
)可以临时缓存到服务器端,直到需要更新该部分。这将导致对数据库进行新的查询(这可能需要花费最多的时间)、生成html、压缩数据并再次将其写入servercache。

非常感谢您的回复。我不知道所有这些HTTP头,它们很有意义。我将在我的代码中测试它们。再次感谢!