Иногда 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
проблема может быть чем-то из сетевого подслоя... Его будет трудно найти.
а насчет 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");