Тайм-аут при загрузке строки - PullRequest
0 голосов
/ 27 июля 2011

Я использую следующие две функции для загрузки строки с сервера. Я также регистрирую время, необходимое для загрузки текста, как с точки зрения клиента, так и с точки зрения сервера. Загруженная строка никогда не совпадает.

Время сервера составляет всего несколько миллисекунд, но время, которое клиент видит, в среднем составляет 100 миллисекунд в зависимости от сигнала Wi-Fi. Время от времени клиента достигает 3000 миллисекунд (но никогда не превышает 3200 мс), хотя время сервера все еще находится в допустимых пределах.

Я начинаю думать, что тайм-аут где-то определен, но я не знаю, где он может быть. Это не в моем коде, и я посмотрел на сайте разработчика и Google безрезультатно.

Я надеюсь, что кто-нибудь подскажет, где можно определить эту задержку, и подтвердит, что по умолчанию она равна 3000 мс.

private String DownloadText(String URL)
{
    String str = "";
    int BUFFER_SIZE = 2000;
    InputStream in = null;
    try{
        in = OpenHttpConnection(URL);
    } catch (IOException e1) {
        e1.printStackTrace();
        return "";
    }
    catch(ArithmeticException ae){
        //
    }
    try{
        InputStreamReader isr = new InputStreamReader(in);
        int charRead;

          char[] inputBuffer = new char[BUFFER_SIZE];          
        try {
            while ((charRead = isr.read(inputBuffer))>0)
            {                    
                //---convert the chars to a String---
                String readString = 
                    String.copyValueOf(inputBuffer, 0, charRead);                    
                str += readString;
                inputBuffer = new char[BUFFER_SIZE];
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return str;        
}

с

private InputStream OpenHttpConnection(String urlString) throws IOException {
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString); 
    URLConnection conn = url.openConnection();

    if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection");

    try{
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect(); 

        response = httpConn.getResponseCode();                 
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();                                 
        }
    }
    catch (Exception ex) {
        throw new IOException("Error connecting");            
    }
    return in;     
}

Кстати: две функции я позаимствовал из результатов поиска Google.

РЕДАКТИРОВАТЬ: я вызываю DownloadText (url) из потока. Я начинал думать, что это может быть связано с таймаутом. Есть ли это?

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Это вам поможет:

  private static final int CONNECT_TIMEOUT_MILL = 10000;
  private static final int READ_TIMEOUT_MILL = 3000;
  ....
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setConnectTimeout(CONNECT_TIMEOUT_MILL);
  con.setReadTimeout(READ_TIMEOUT_MILL);
  ....
0 голосов
/ 19 апреля 2012

Я видел подобное поведение раньше.В моем случае это были вызовы AJAX, и это было настоящей загадкой для меня.В моем случае оказалось, что сервер возвращал данные без указания

  1. длины содержимого или
  2. закрытия http-соединения

Так чтобраузер должен был ожидать истечения времени ожидания соединения, прежде чем он обработает данные и сгенерирует событие приема.Нечто подобное может произойти в вашем случае, так что разбейте программное обеспечение для сетевого анализа и проверьте правильность http.Я обычно использую Fiddler2 для этого типа работы, но я не знаю, сможете ли вы заставить устройство Android очень хорошо проходить через прокси.Звучит так, как будто вы управляете веб-сервером, поэтому, возможно, проверка tcp-пакетов с этой стороны возможна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...