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