开发者

Sometimes HttpURLConnection.getInputStream executes too slowly

We have next code.

Sometimes we should wait 10-20-40 seconds on the last line.

What can be the problem?

Java 1.4

URL url = ...;
HttpURLConnection conn = (HttpURLConnection) url.开发者_JS百科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();

UPDATED:

Next code fixes the problem IN ECLIPSE.

But it still DOES NOT WORK via Java WebStart:(

HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setDoInput(true);  
conn.setDoOutput(true);  
conn.setUseCaches(false);  
System.setProperty("http.keepAlive", "false");  //<---------------
conn.connect();  

But why?

UPDATED one more time!

Bug was fixed! :)

We worked with connections not in one class but in two.

And there is following line in the second class:

URL url = ...  
HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setRequestProperty("Content-Length", "1000");  //<------------
conn.connect();  

Note: setRequestProperty("Content-Length", "1000") is root cause of the problem.


'We had a similar issue which is caused by buggy keep-alive in old Java. Add this before connect to see if it helps,

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

or

System.setProperty("http.keepAlive", "false");


Had the same problem, found out it was caused by IPv6.

You Disable it from code using:

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

You can also disable it via the command line using : g-Djava.net.preferIPv4Stack=true


Try it with an IP address. To see if it's a DNS problem.


I had same problem, so i change to HTTPClient from Apache, follow a example:

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


The problem can be something from network sub layer... Should be hard to find it.

But what about the setReadTimeOut() with low value and a while loop?


One thing I would guess is that your DNS server isn't responding well.

Can you experiment with changing symbolic domain names to numeric IP addresses before you start? Or can you do each request twice (just for experimentation) and see if the first request is significantly slower than the second?

Google has put up a DNS server at (among others) 8.8.8.8 . They claim it's faster than most other DNS servers. Give that a try!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜