2010-01-31 18 views
6

J'espère que quelqu'un pourrait m'aider avec des connexions intermittentes Je suis en utilisant le code avec HttpsURLConnection. Le code que je utilise est ci-dessous:HttpsURLConnection et connexions intermittentes

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

La connexion fonctionne la première fois à chaque fois que je l'utilise pour tirer un fichier JSON. Toutefois, lorsque j'utilise à nouveau la connexion pour envoyer une commande, échoue toujours la première fois. Cela fonctionne généralement si j'envoie la commande rapidement (dans les 5 secondes), mais échoue si j'attends un peu. Je ne pense pas que ce soit un problème de SSL, car il se connecte la première fois correctement, mais je pourrais me tromper ici. J'ai essayé aussi de nombreuses variations telles que l'ajout:

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

Cependant, je n'avais pas de chance. Toute aide serait grandement appréciée.

+0

Si Je pourrais suggérer d'utiliser 'LogCat' et mettre des instructions de débogage à l'intérieur de votre bloc de code afin qu'il puisse vous rapporter exactement ce qui échoue et où e –

+0

La réponse Logcat que j'obtiens de conn.getResponseCode() est "-1" J'ai cherché et je n'ai trouvé rien sur un code de réponse -1 pour les connexions https. – OliverPank

Répondre

9

Essayez System.setProperty("http.keepAlive", "false"); avant de faire

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

Parfait. Cela a fonctionné. Je ne savais pas que vous pouviez utiliser "Système". Je suppose que la connexion SSL a été maintenue ouverte avant que je me suis déplacé à travers différentes activités. Merci! – OliverPank

+0

Oui, je pense que cela a quelque chose à voir avec le flux d'erreurs n'étant pas lu complètement. – m6tt

+0

http://code.google.com/p/android/issues/detail?id=2939 Doit être réparé à partir de Froyo. –

1

Essayez ce code - cela fonctionne assez fiable pour moi:

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

Merci ... c'est beaucoup plus compliqué que mon simple https url connect. Je ne suis pas sûr de savoir comment l'utiliser exactement. Où dois-je entrer mon URL puisque la fonction getThreadSafeHttpClient n'a aucune entrée? – OliverPank

+0

vous l'utilisez juste pour obtenir HttpClient et ensuite utiliser le client comme d'habitude. Quelque chose comme 'Client HttpClient = getThreadSafeHttpClient();' – Bostone

+0

HttpGet get = new HttpGet (url); Réponse HttpResponse = this.client.execute (get); – Bostone

0

Juste un peu plus de la réponse de m6tt ci-dessus:

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