HTTP-запросы с HttpClient слишком медленные?

Я пытаюсь кодировать приложение для Android, которое отправляет некоторые значения сообщений в файл php, размещенный на выделенном сервере, и сохраняет массив resoult

код это

   HttpPost httppost;
    DefaultHttpClient httpclient;

    httppost = new HttpPost("http://IP/script.php"); 
    HttpParams param = new BasicHttpParams(); 
    param.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);


  //  httppost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);

    HttpProtocolParams.setContentCharset(param, "UTF-8");

    httpclient = new DefaultHttpClient(param);

    ResponseHandler <String> res=new BasicResponseHandler(); 
    List<NameValuePair> nameValuePairs;

    nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("id","1"));
    nameValuePairs.add(new BasicNameValuePair("api", "1"));


    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
Log.v("1",System.currentTimeMillis()+"");// Log to know the time diff
    String result= httpclient.execute(httppost, res);
Log.v("2",System.currentTimeMillis()+""); //  Log to know the time diff

этот код тратит около 2,5 секунд (в сетях 3G или Wi-Fi) на отправку сообщения и получение с сервера только строки «ok», даже при хорошем Wi-Fi на этот раз только до 2,2 / 2,0 секунд.

Я запустил простой сценарий Ajax sendpost на моем компьютере, подключенном к Интернету через тот же телефон и 3G, на то же самое требуется около 0,300 мс, поэтому ¿То же соединение, то же действие, разница в 2 секунды?

/// *** ОБНОВЛЕНИЕ

Я снова попробовал свой скрипт jquery на своем компьютере (с подключением мобильного 3G + / HDSPA)

среднее время ответа составляет около 250 мс, но всегда первый запрос до 1,7 секунды, я пытался отправлять сообщения с интервалами в 30 секунд, и я получил среднее время 1,5 секунды, затем Я пытался отправить сообщение с интервалом в 2 секунды, первое было 1,41 с, а затем 252 мс

здесь вы можете просмотреть диаграмму: http://i46.tinypic.com/27zjl8n.jpg

Этот же тест с кабельным подключением (стандартный домашний DSL) всегда предлагает фиксированное время отклика в интервале ~ 170 мс независимо от (здесь не веские аргументы, но ИМХО, возможно, первая попытка немного выше)

Итак, что-то вышло (или не так) серьезно повлияло на мобильные соединения с первой попытки. Есть идеи, ребята?


person Colas    schedule 16.09.2012    source источник
comment
2 секунды больше, чем должно быть короче. Я получил ответы в миллисекундах. Не могу сказать, что здесь не так, просто время должно быть лучше.   -  person Nathan Schwermann    schedule 17.09.2012
comment
@Colas, было бы неплохо, если бы вы упомянули, что часть вашего вопроса с 3G бессмысленна, так как у вас такая же проблема с WiFi.   -  person Brad    schedule 17.09.2012
comment
@Colas, Настройте свое устройство на использование прокси-сервера, чтобы увидеть, что на самом деле происходит. Используйте Fiddler на своем ПК в качестве прокси-сервера.   -  person Brad    schedule 17.09.2012
comment
Как часто вы звоните в свою службу? При первом вызове устройству, возможно, придется разбудить радиомодули 3G, и это может занять несколько секунд. Любые звонки, сделанные вскоре после вашего первого звонка, должны быть быстрее.   -  person Rob    schedule 17.09.2012
comment
@rob, похоже, вы правы, первый пост занимает около 2-3 секунд, но nexts занимает около 0,800 с, если я жду 10 секунд между каждым постом, это снова занимает 3 секунды .. или, может быть, это связано с http keep-alive ?   -  person Colas    schedule 17.09.2012
comment
Есть идеи с обновлением новой информации?   -  person Colas    schedule 21.09.2012
comment
Взгляните на информацию здесь, которая объясняет, как телефоны подключаются к сети и чем это отличается от того, как это работает в WLAN. Вы видите, что соединение с сетью GSM прерывается и требуется некоторое время для повторного подключения. developer.att.com/developer/forward.jsp?passedItemId=8100027   -  person Rod Burns    schedule 05.10.2012


Ответы (1)


Попробуйте использовать эту конфигурацию

HttpClient httpclient = new DefaultHttpClient();
HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);

Это javadoc о setTcpNoDelay:

public static void setTcpNoDelay (HttpParams params, boolean value)

С момента: API уровня 1

Определяет, следует ли использовать алгоритм Нэгла. Алгоритм Нагла пытается сохранить полосу пропускания, минимизируя количество отправляемых сегментов. Когда приложения хотят уменьшить сетевую задержку и повысить производительность, они могут отключить алгоритм Нэгла (то есть включить TCP_NODELAY). Данные будут отправлены раньше за счет увеличения потребления полосы пропускания.

Параметры

значение true, если алгоритм Нэгла НЕ должен использоваться (то есть включить TCP_NODELAY), в противном случае - false.

person MAJS    schedule 29.11.2012
comment
не для меня :( Я использую org.apache.httpcomponents: httpclient: 4.5.4 и setTcpNoDelay (true) не имеет значения. На самом деле для TcpNoDelay установлено значение true по умолчанию. Я не понимаю, почему Apache Http Client работает медленнее, чем Библиотека OkHttp или базовый http-клиент, выпущенный с golang - person Alessio Santacroce; 28.09.2018