Android:系统调用期间出现 SSLException I/O 错误,连接超时

Android: SSLException I/O error during system call, Connection timed out

提问人:BRDroid 提问时间:3/27/2014 更新时间:12/16/2019 访问量:9172

问:

我的 android 代码中有一个函数,它使用 KSOAP 将数据发送到 Web 服务。我能够将数据发送到服务,但有时我收到异常:“系统调用期间 SSLException I/O 错误,连接超时”。

在进行了几次测试后,我的观察结果是:

  • 如果 wifi/移动数据已经打开并且我向网络服务发送数据,我不会遇到异常。
  • 只有当我打开wifi/移动数据时,我才会得到它,当我尝试发送数据时,一旦它连接了。

我对如何克服这个异常一无所知。 如果可以,请建议/指导我如何克服此异常将是一个很大的帮助。

以下是用于将数据发送到 ASYNC 任务中调用的 Web 服务的方法。

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;

    }

wifi例外

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)

谢谢。

android-asynctask ksoap2 sslexception

评论

0赞 Gabi Radu 9/26/2014
我可以看到这是一个旧帖子,我想你修好了吗?您是否将代码块放在 try/catch 语句中,并且在实际发送到服务器之前,您是否检查了是否有可用的互联网连接?
1赞 BRDroid 10/26/2014
您好用户1140656,很抱歉延迟回复。是的,问题已解决。基本上,我是从一个单独的类(后台操作)中的 AsyncTask 调用这个方法的。当我有数据要发送到服务器时,我首先检查是否有互联网连接,然后通过 AsyncTask 调用上述函数。
0赞 Gabi Radu 10/26/2014
是的,首先检查是否有互联网连接,然后执行代码。
0赞 BRDroid 10/27/2014
您好“user1140656”,我现在一直在测试应用程序,发现我仍然面临同样的问题,异常:“系统调用期间 SSLException I/O 错误,连接超时”,即使在我将其发送到服务器之前检查是否有互联网连接。有什么建议吗?
0赞 Gabi Radu 10/28/2014
您是否尝试/捕获代码块并可能打印 System.out?

答:

1赞 Jake McGinty 3/17/2015 #1

这似乎类似于 Android 中返回断开连接的错误:https://code.google.com/p/android/issues/detail?id=65463

ksoap2-android 库受此影响,您的 SOAP 库可能也受此影响。引用该问题:

如果您使用 ksoap for android:

ArrayList<HeaderProperty> headerPropertyArrayList = new ArrayList<HeaderProperty>();
headerPropertyArrayList.add(new HeaderProperty("Connection", "close"));

并使用 更新您的通话。.call(SOAP_ACTION, envelope, headerPropertyArrayList)

0赞 Matt Fiocca 12/16/2019 #2

我知道这已经很久了,但只是增加了对话。

我不时在山上收到这条消息,当互联网中断或太弱时,在向我们的服务器发出 api 调用的 ssl 握手的那一刻。在通话之前,互联网可能可用,但在中途,互联网在确切的不方便的时间点掉线

如果我绝对需要调用成功,我所做的是根据捕获的异常构建重试队列,并继续尝试调用,直到它成功或您获得某种确认。

出于这个原因,我也在探索将我的 https 网络调用转移到基于 MQTT 的调用上,以减少这些握手所需的开销。我们的应用程序在互联网粗略的地方至关重要,但对于大多数人来说可能有点矫枉过正。