Android: ошибка ввода-вывода SSLException во время системного вызова, тайм-аут соединения
У меня есть функция в моем коде Android, которая отправляет данные в веб-сервис с помощью KSOAP. Я могу отправить данные в службу, но иногда получаю исключение: "Ошибка ввода-вывода SSLException во время системного вызова, истекло время ожидания соединения".
После выполнения пары тестов мои наблюдения таковы:
- Если Wi-Fi / мобильные данные уже включены, и я отправляю данные в веб-сервис, я не получаю исключения.
- Я получаю его только тогда, когда просто включаю Wi-Fi / мобильную передачу данных и когда он подключается, когда я пытаюсь отправить данные
Я не знаю, как преодолеть это исключение. Если вы можете предложить / направить меня, как преодолеть это исключение, было бы очень полезно.
Ниже приведен метод, используемый для отправки данных в веб-службу, которая вызывается в задаче ASYNC.
public String incidentDataToServer(JSONObject incidentJSON) {
// package the request
SoapObject Request = new SoapObject(INCIDENT_NAMESPACE,
INCIDENT_METHOD_NAME);
String incidentData = incidentJSON.toString();
PropertyInfo pi = new PropertyInfo();
pi.setName("IncidentJSonString");
pi.setValue(incidentData);
pi.setType(String.class);
Request.addProperty(pi);
// set the soap serialization envelope, set it to .net and package
// the entire request and pass to soap envelope.
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(Request);
HttpTransportSE aht = new HttpTransportSE(URL);
try {
aht.call(INCIDENT_SOAP_ACTION, soapEnvelope);
SoapPrimitive resultString = (SoapPrimitive) soapEnvelope
.getResponse();
resIncident = resultString.toString();
} catch (Exception e) {
e.printStackTrace();
}
return resIncident;
}
Исключение по Wi-Fi
03-27 09:36:45.920: W/System.err(7603): javax.net.ssl.SSLException: Write error: ssl=0x4818f2c8: I/O error during system call, Connection timed out
03-27 09:36:45.960: W/System.err(7603): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
03-27 09:36:45.960: W/System.err(7603): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:693)
03-27 09:36:45.960: W/System.err(7603): at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)
03-27 09:36:45.960: W/System.err(7603): at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:85)
03-27 09:36:45.960: W/System.err(7603): at libcore.net.http.FixedLengthOutputStream.flush(FixedLengthOutputStream.java:49)
03-27 09:36:45.960: W/System.err(7603): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:188)
03-27 09:36:45.960: W/System.err(7603): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
03-27 09:36:45.960: W/System.err(7603): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
03-27 09:36:45.960: W/System.err(7603): at com.dimensions.dimensionsapp.ServerAuthentication.incidentDataToServer(ServerAuthentication.java:121)
03-27 09:36:45.960: W/System.err(7603): at com.dimensions.dimensionsapp.DataToServer$IncidentDataToServer.doInBackground(DataToServer.java:89)
03-27 09:36:45.960: W/System.err(7603): at com.dimensions.dimensionsapp.DataToServer$IncidentDataToServer.doInBackground(DataToServer.java:1)
03-27 09:36:45.970: W/System.err(7603): at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-27 09:36:45.970: W/System.err(7603): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-27 09:36:45.970: W/System.err(7603): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-27 09:36:45.970: W/System.err(7603): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-27 09:36:45.970: W/System.err(7603): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-27 09:36:45.970: W/System.err(7603): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-27 09:36:45.970: W/System.err(7603): at java.lang.Thread.run(Thread.java:856)
Исключение на MobileData
03-27 09:47:46.279: W/System.err(3795): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
03-27 09:47:46.279: W/System.err(3795): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:693)
03-27 09:47:46.279: W/System.err(3795): at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)
03-27 09:47:46.279: W/System.err(3795): at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:85)
03-27 09:47:46.299: W/System.err(3795): at libcore.net.http.FixedLengthOutputStream.flush(FixedLengthOutputStream.java:49)
03-27 09:47:46.299: W/System.err(3795): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:188)
03-27 09:47:46.299: W/System.err(3795): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
03-27 09:47:46.309: W/System.err(3795): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
03-27 09:47:46.319: W/System.err(3795): at com.dimensions.dimensionsapp.ServerAuthentication.incidentDataToServer(ServerAuthentication.java:121)
03-27 09:47:46.319: W/System.err(3795): at com.dimensions.dimensionsapp.DataToServer$IncidentDataToServer.doInBackground(DataToServer.java:89)
03-27 09:47:46.319: W/System.err(3795): at com.dimensions.dimensionsapp.DataToServer$IncidentDataToServer.doInBackground(DataToServer.java:1)
03-27 09:47:46.319: W/System.err(3795): at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-27 09:47:46.319: W/System.err(3795): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-27 09:47:46.339: W/System.err(3795): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-27 09:47:46.339: W/System.err(3795): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-27 09:47:46.339: W/System.err(3795): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
03-27 09:47:46.339: W/System.err(3795): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
03-27 09:47:46.339: W/System.err(3795): at java.lang.Thread.run(Thread.java:856)
Спасибо.
1 ответ
Это похоже на ошибку в Android, которая возвращает отключенные соединения: https://code.google.com/p/android/issues/detail?id=65463.
Это затронуло библиотеку ksoap2-android, и ваша библиотека SOAP тоже может быть. Цитировать из вопроса:
Если вы используете ksoap для Android:
ArrayList<HeaderProperty> headerPropertyArrayList = new ArrayList<HeaderProperty>();
headerPropertyArrayList.add(new HeaderProperty("Connection", "close"));
И обновление вашего звонка с .call(SOAP_ACTION, envelope, headerPropertyArrayList)
,
Я знаю, что это старше, но просто добавляю к разговору.
Я получаю это сообщение время от времени в горах, когда Интернет отключается или становится слишком слабым, именно в тот момент, когда выполняется ssl-подтверждение вызова api на наши серверы. Интернет мог быть доступен до этого звонка, но в середине интернет отключается в самый неподходящий момент
Что я делаю, чтобы смягчить это, если мне абсолютно необходим вызов для успешного выполнения, - это построить очередь повторных попыток на основе пойманного исключения и продолжать попытки вызова до тех пор, пока либо он не будет успешным, либо вы не получите какое-либо подтверждение.
По этой причине я также изучаю возможность переноса сетевых вызовов https на что-то, основанное на MQTT, чтобы уменьшить накладные расходы, связанные с этими рукопожатиями. Наше приложение имеет решающее значение в тех местах, где Интернет отрывочен, и, вероятно, для большинства из них будет слишком много.