httpsurlconnection والاتصالات المتقطعة
-
24-09-2019 - |
سؤال
آمل أن يساعدني شخص ما من خلال الاتصالات المتقطعة التي أحصل عليها باستخدام الكود مع httpsurlconnection. الكود الذي أستخدمه أدناه:
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(10 * 1000);
if conn.getResponseCode() != 200) {
Log.v(TAG, "error code:" + conn.getResponseCode());
}
يعمل الاتصال في المرة الأولى في كل مرة عندما أستخدمها لسحب ملف JSON. ومع ذلك ، عندما أستخدم الاتصال مرة أخرى لإرسال أمر ، فإنه يفشل دائمًا في المرة الأولى. ثم يعمل عادة إذا أرسلت الأمر بسرعة (في غضون 5 ثوان) ، لكنه فشل إذا انتظرت بعض الوقت. لا أعتقد أنها مشكلة SSL لأنها تربط المرة الأولى بشكل صحيح ، لكنني قد أكون مخطئًا هنا. لقد جربت أيضًا العديد من الاختلافات المختلفة مثل إضافة:
conn.setUseCaches(false);
conn.setRequestProperty("Connection","Keep-Alive");
conn.getHostnameVerifier();
conn.getSSLSocketFactory();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.wait(100);
ومع ذلك ، لم يكن لدي حظ. أي مساعدة سيكون موضع تقدير كبير.
المحلول
محاولة System.setProperty("http.keepAlive", "false");
قبل أن تفعل
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
نصائح أخرى
جرب هذا الرمز - إنه يعمل بشكل موثوق بالنسبة لي:
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;
}
مجرد إضافة صغيرة إلى إجابة M6TT أعلاه:
private static void disableConnectionReuseIfNecessary() {
// HTTP connection reuse which was buggy pre-froyo
if (!Constants.SUPPORTS_FROYO) {
System.setProperty("http.keepAlive", "false");
}
}