3

HttpURLConnection.getInputStream занимает очень много времени по сравнению с iPhone App, в котором используются одни и те же серверные службы.HttpURLConnection.getInputStream очень медленно

Следующий код используется для обслуживания:

  date= new java.util.Date();    
     Log.d("time","Time Stamp before posting "+new Timestamp(date.getTime())); 

     URL ur= new URL(url);   
     HttpURLConnection conn = (HttpURLConnection) ur.openConnection(); 
     conn.setRequestProperty("Connection", "close"); 
     conn.setReadTimeout(10000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("POST"); 
     conn.setDoInput(true); 
     conn.setDoOutput(true);    
     OutputStream os = conn.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(
       new OutputStreamWriter(os, "UTF-8")); 
     writer.write(getQuery(nameValuePairs)); 
     writer.close(); 
     os.close(); 
     conn.connect(); 

     StringBuffer response=null;    
     try{   
      Log.d("time","Time Stamp bfr InputStream "+new Timestamp(date.getTime()));  

      InputStream is = conn.getInputStream(); 

      date= new java.util.Date();    
      Log.d("time","Time Stamp aftr InputStream "+new Timestamp(date.getTime()));    

      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
      String line; 
      response = new StringBuffer(); 
      while((line = rd.readLine()) != null) { 
       response.append(line); 
       response.append('\r'); 
      } 
      rd.close(); 
      response.toString(); 
      result=response.toString(); 

     } catch (Exception e) { 

     } 

Чтобы проверить, где служба занимает много времени, я ставлю запись журнала для печати TimeStamp.

Среднее время для процесса выглядит следующим образом:

Среднее время для размещения на сервере занимает менее 2 мили секунды
Среднее время для создания входного потока занимает почти 5 секунд

Среднее время для записи ответа менее 2 мил секунд.

Любая идея о том, почему поток ввода занимает много времени, что делает весь сервис очень медленным?

ответ

-1

Установите urlConnection.setConnectTimeout() на более низкий тайм-аут.

Класс документации URLConnection.setConnectTimeout() говорит:

Устанавливает максимальное время в миллисекундах ожидания при подключении. Соединение с сервером завершится с ошибкой SocketTimeoutException, если истечет время ожидания до установления соединения. Значение по умолчанию 0 приводит к блокировке соединения. Это не означает, что мы никогда не будем тайм-аут, но это, вероятно, означает, что вы получите таймаут TCP через несколько минут.

Предупреждение: если имя хоста разрешено для нескольких IP-адресов, этот клиент будет пробовать каждый в заказе RFC 3484. Если подключение к каждому из этих адресов не удастся, произойдет несколько тайм-аутов до того, как попытка подключения сделает исключение. Имена хостов, поддерживающие IPv6 и , IPv4 всегда имеют не менее 2 IP-адресов.

Первоначально у меня был установлен мой номер urlConnection.setConnectTimeout(30000);, а затем сменил его на urlConnection.setConnectTimeout(1000). Сразу же я увидел более быстрые результаты.

Надеюсь, это поможет!

+2

Вы имеете в виду, что видели быстрые сбои соединения, когда вы их получили. Трудно понять, как это решает проблему OP. – EJP

0

Это может быть связано с ошибкой, представленной в JDK 7. «HttpServer вызывает задержку в 1000 мс при использовании кэша keep-alive». См:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8009548

В зависимости от ваших целей, предлагаемый обходной путь является мульти-нить в HttpURLConnection. Например, если вы используете HttpServer вы можете сделать:

server.setExecutor(Executors.newFixedThreadPool(5)); 
+0

Только если он использует 'HttpServer' на другом конце. Об этом нет. И предлагаемое решение - многопоточный сервер *, который опять не имеет значения. – EJP

1

Вы не измеряет то, что вы думаете, что вы измеряете. На сервер ничего не записывается, пока вы не назовете getInputStream() или getResponseCode().Так что вы на самом деле измерения:

  • время соединения
  • время передачи
  • время обработки на сервере

, когда вы думаете, что вы просто измерения getInputStream времени().

Причина в том, что HttpURLConnection автоматически устанавливает заголовок длины содержимого, буферизуя весь вывод. Вы можете избежать этого, используя режим передачи каналов. Тогда, по крайней мере, вы увидите, где время действительно идет.

+2

Как мы это сделаем? – georgiaboy82

Смежные вопросы