Иногда HttpURLConnection.getInputStream выполняется слишком медленно

у нас есть следующий код.
Иногда мы должны ждать 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();  

но почему?

обновлено еще раз!
Ошибка была исправлена! :)

Мы работали со связями не в одном классе, а в два.
И есть следующая строка во втором классе:

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

Примечание.: setRequestProperty("Content-Length", "1000") является основной причиной проблемы.

6 ответов


' у нас была аналогичная проблема, вызванная багги keep-alive в старой Java. Добавьте это перед подключением, чтобы узнать, помогает ли это,

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

или

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

имел ту же проблему, узнал, что это было вызвано IPv6.

отключить его из кода:

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

вы также можете отключить его через командную строку, используя : g-Djava.net.preferIPv4Stack=true


попробуйте с IP-адресом. Чтобы увидеть, если это проблема DNS.


проблема может быть чем-то из сетевого подслоя... Его будет трудно найти.

а насчет setReadTimeOut() С низким значением и циклом while?


Я бы предположил, что ваш DNS-сервер не отвечает Хорошо.

можете ли вы поэкспериментировать с изменением символических доменных имен на числовые IP-адреса перед запуском? Или вы можете выполнить каждый запрос дважды (только для экспериментов) и посмотреть, значительно ли первый запрос медленнее второго?

Google разместил DNS-сервер на (Среди прочих) 8.8.8.8 . Они утверждают, что это быстрее, чем большинство других DNS-серверов. Попробуйте!


У меня была такая же проблема, поэтому я перехожу на HTTPClient из Apache, следуйте примеру:

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