Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 有时HttpURLConnection.getInputStream执行得太慢_Java_Http_Tomcat_Servlets - Fatal编程技术网

Java 有时HttpURLConnection.getInputStream执行得太慢

Java 有时HttpURLConnection.getInputStream执行得太慢,java,http,tomcat,servlets,Java,Http,Tomcat,Servlets,我们有下一个代码。 有时我们应该在最后一行等待10-20-40秒。 有什么问题吗 Java 1.4 URL url = ...; HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.connect(); OutputStream out = conn.getOu

我们有下一个代码。
有时我们应该在最后一行等待10-20-40秒。
有什么问题吗

Java 1.4

URL url = ...;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
OutputStream out = conn.getOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(out);
try
{
   outStream.writeObject(objArray);
}
finally
{
   outStream.close();
}

InputStream input = conn.getInputStream();
更新:
下一段代码修复了ECLIPSE中的问题。
但它仍然无法通过Java WebStart:(

HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setDoInput(true);  
conn.setDoOutput(true);  
conn.setUseCaches(false);  
System.setProperty("http.keepAlive", "false");  //<---------------
conn.connect();  
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoInput(真);
连接设置输出(真);
conn.SETUSECHACHES(假);

System.setProperty(“http.keepAlive”,“false”);//请使用IP地址尝试。以查看是否是DNS问题。

问题可能来自网络子层……应该很难找到它


但是对于低值和一个while循环的DNS服务器呢?

我想有一件事是您的DNS服务器响应不好

在开始之前,您可以尝试将符号域名更改为数字IP地址吗?或者您可以对每个请求执行两次(仅用于实验),然后查看第一个请求是否比第二个请求慢很多


谷歌在8.8.8.8.8上安装了一个DNS服务器。他们声称它比大多数其他DNS服务器都快。试试看!

'我们也遇到了一个类似的问题,这是由旧Java中的bug keep alive引起的。在连接之前添加这个,看看是否有帮助

conn.setRequestProperty("Connection", "close");


有同样的问题,发现它是由IPv6引起的

您可以使用以下命令从代码中将其禁用:

System.setProperty("java.net.preferIPv4Stack" , "true");

您还可以使用以下命令行禁用它:
g-Djava.net.preferIPv4Stack=true

我也遇到了同样的问题,因此我从Apache更改为HTTPClient,如下示例:

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost request = new HttpPost("www.myurl-to-read");

RequestConfig requestConfig = RequestConfig.custom()
                              .setSocketTimeout(8000)
                              .setConnectTimeout(10000)
                              .setConnectionRequestTimeout(1000)
                              .build();

request.setConfig(requestConfig);

request.setHeader("Content-type", "application/json");

HttpResponse  response = httpClient.execute(request);

HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");

为什么调用openConnection两次?这只是打印错误。更正了。为什么内容长度是问题所在?我们在不同的计算机和不同的国家/地区遇到了这个问题:(你有没有用Wireshark查看过它?我们在不同的计算机和不同的国家/地区遇到了这个问题:(在同一家公司?您的专用网络中的DNS是否相同?与其说是在哪里查找DNS,不如说是由哪个DNS服务器处理目的地。如果您访问廷巴克图的一个站点时网络速度较慢等等,那么问题可能就在那里。我不会排除这种可能性,除非先查看响应ti用于DNS查找的mes。生产环境和测试环境不同。我放弃了-我帮不了你。第二种方法如何?你真的需要发布一个TCP转储来查看到底是什么问题。我不认为这是DNS,因为它发生在connect()中调用。在我看来keepAlive=false有帮助。但是为什么?没有跟踪,我只是猜测。HTTP请求有keepAlive但没有内容长度,服务器不知道请求的结尾在哪里,所以它一直在等待。Apache上的默认超时是30秒。当keepAlive关闭时,输出流将关闭,这将通知t服务器请求已完成。wireshark/ethereal、tcpdump、snoop。这实际上取决于您的操作系统。设置
connection=close
头应该可以工作。可能您没有正确设置请求属性。应该在
connect()之前完成
。设置系统属性
http.keepalive=false
基本上是一样的,但作为一种低级解决方法。如果不是手动指定,则
URLConnection
使用它来设置
连接头。它在webstart中不起作用只是一种安全限制。但无论如何,
setRequestProperty(“连接”、“关闭”)
必须正常工作。请重试并验证是否正确操作。
System.setProperty("java.net.preferIPv4Stack" , "true");
HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost request = new HttpPost("www.myurl-to-read");

RequestConfig requestConfig = RequestConfig.custom()
                              .setSocketTimeout(8000)
                              .setConnectTimeout(10000)
                              .setConnectionRequestTimeout(1000)
                              .build();

request.setConfig(requestConfig);

request.setHeader("Content-type", "application/json");

HttpResponse  response = httpClient.execute(request);

HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");