2010-01-31 12 views
6

Spero che qualcuno possa aiutarmi con connessioni intermittenti Sono utilizzando codice con HttpsURLConnection. Il codice che sto utilizzando è di seguito:HttpsURLConnection e connessioni intermittenti

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
      conn.setReadTimeout(10 * 1000); 
if conn.getResponseCode() != 200) { 
      Log.v(TAG, "error code:" + conn.getResponseCode()); 
} 

La connessione funziona la prima volta ogni volta quando lo uso per tirare un file JSON. Tuttavia, quando uso di nuovo la connessione per inviare un comando, fallisce sempre la prima volta. Funziona quindi in genere se invio il comando rapidamente (entro 5 secondi), ma fallisce se attendo qualche istante. Non penso che sia un problema SSL perché collega la prima volta correttamente, ma potrei sbagliarmi qui. Ho anche provato molti varianti come l'aggiunta di:

conn.setUseCaches(false); 
conn.setRequestProperty("Connection","Keep-Alive"); 
conn.getHostnameVerifier(); 
conn.getSSLSocketFactory(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestMethod("POST"); 
conn.wait(100); 

Tuttavia, ho avuto fortuna. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Se Potrei suggerire di usare 'LogCat' e inserire le istruzioni di debug all'interno del blocco di codice in modo che possa riferirti esattamente a cosa fallisce e dove e –

+0

La risposta di Logcat che ottengo da conn.getResponseCode() è "-1". Ho cercato e non ho trovato nulla su un codice di risposta -1 per le connessioni https. – OliverPank

risposta

9

Prova System.setProperty("http.keepAlive", "false"); prima di fare

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
+0

Perfect. Questo ha funzionato. Non sapevo che si potesse usare "Sistema". Immagino che la connessione SSL sia stata mantenuta aperta prima che io passassi attraverso diverse attività. Grazie! – OliverPank

+0

Sì, penso che abbia qualcosa a che fare con l'errore che non viene letto completamente. – m6tt

+0

http://code.google.com/p/android/issues/detail?id=2939 Dovrebbe essere risolto a partire da Froyo. –

1

Prova questo codice - funziona abbastanza affidabile per me:

public static final String USER_AGENT = "Mozilla/5.0 (Linux; U; Android 1.1; en-us;dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2"; 
private DefaultHttpClient getThreadSafeHttpClient() { 
    final HttpParams params = new BasicHttpParams(); 
    params.setParameter("http.useragent", USER_AGENT); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 
    final SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
    sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
    registry.register(new Scheme("https", sslSocketFactory, 443)); 
    final ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); 
    final DefaultHttpClient httpclient = new DefaultHttpClient(manager, params); 
    // how to handle retries 
    final HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { 
     public boolean retryRequest(final IOException exception, final int executionCount, final HttpContext context) { 
      if (executionCount >= 5) { 
       // Do not retry if over max retry count 
       return false; 
      } 
      if (exception instanceof NoHttpResponseException) { 
       // Retry if the server dropped connection on us 
       return true; 
      } 
      if (exception instanceof SSLHandshakeException) { 
       // Do not retry on SSL handshake exception 
       return false; 
      } 
      final HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST); 
      final boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); 
      if (idempotent) { 
       // Retry if the request is considered idempotent 
       return true; 
      } 
      return false; 
     } 

    }; 
    httpclient.setHttpRequestRetryHandler(myRetryHandler); 
    return httpclient; 
} 
+0

Grazie ... è molto più complicato del mio semplice URL https connect. Non sono sicuro di come usarlo esattamente. Dove inserirò il mio url poiché la funzione getThreadSafeHttpClient non ha input? – OliverPank

+0

basta usarlo per ottenere HttpClient e quindi utilizzare client come al solito. Qualcosa come 'Client HttpClient = getThreadSafeHttpClient();' – Bostone

+0

HttpGet get = new HttpGet (url); HttpResponse response = this.client.execute (get); – Bostone

0

Solo un po ', oltre alla risposta di m6tt sopra:

private static void disableConnectionReuseIfNecessary() { 
    // HTTP connection reuse which was buggy pre-froyo 
    if (!Constants.SUPPORTS_FROYO) { 
     System.setProperty("http.keepAlive", "false"); 
    } 
} 
Problemi correlati