HttpsURLConnection e le connessioni intermittenti
-
24-09-2019 - |
Domanda
Sto sperando che qualcuno mi potrebbe aiutare con connessioni intermittenti Sono ottenere utilizzando il codice con HttpsURLConnection. Il codice che sto utilizzando è qui di seguito:
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(10 * 1000);
if conn.getResponseCode() != 200) {
Log.v(TAG, "error code:" + conn.getResponseCode());
}
Il collegamento funziona la prima volta ogni volta quando lo uso per tirare un di file JSON. Tuttavia, quando uso di nuovo la connessione per inviare un comando, fallisce sempre la prima volta. E 'quindi in genere funziona se io mando il Comando rapidamente (entro 5 secondi), ma non riesce se aspetto un po '. Non credo che il suo un problema SSL perché collega la prima volta correttamente, ma potrei sbagliarmi qui. Ho anche provato molti diversi variazioni 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, non ho avuto fortuna. Qualsiasi aiuto sarebbe molto apprezzato.
Soluzione
Prova System.setProperty("http.keepAlive", "false");
prima di fare
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
Altri suggerimenti
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;
}
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");
}
}