1

我看到了类似的问题,但我没有找到答案。我正在使用 ksoap2 库与网络服务器连接,有时我得到那个异常 java.net.SocketTimeoutException: read timed out。

这是我的代码:

    SoapObject request = new SoapObject(NAMESPACE, method);

    if (properties != null) {
        for (PropertyInfo property : properties) {
            request.addProperty(property);
        }
    }

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);;

    HttpsTransportSE transport = new HttpsTransportSE(HOST, PORT, FILE, TIMEOUT);

    transport.debug = true;
    transport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

    try {
        transport.call(NAMESPACE + "#" +  soapAction, envelope);

        Object res = (Object)envelope.getResponse();

        return res;
    } catch (Exception e) {
        Log.e("WebService", e.toString());

        return null;
    }

我可以在某处更改套接字的超时时间还是我能做什么?

4

10 回答 10

4

您可以通过提供 Web 服务需要响应的平均时间来控制超时异常。

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);
于 2016-07-11T09:38:59.647 回答
3

当服务没有响应或可能存在网络连接问题时,Socket 会超时。在我的情况下,当服务开始响应时,我没有收到套接字超时异常,因此问题得到了解决。这是我的代码:

public SoapObject soap(String METHOD_NAME, String SOAP_ACTION, String NAMESPACE, String URL) throws IOException, XmlPullParserException 
{
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //set up request
    // adding a property to SoapObject
    PropertyInfo pi = new PropertyInfo();
    FileDetailList C = new FileDetailList();
    pi.setName("C");
    pi.setValue(C);
    pi.setType(C.getClass());
    request.addProperty(pi);
    //  request.addProperty("iTopN", "5"); //variable name, value. I got the variable name, from the wsdl file!
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //put all required data into a soap envelope
    envelope.setOutputSoapObject(request);  //prepare request
    HttpTransportSE httpTransport = new HttpTransportSE(URL);
    //  AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);  
    httpTransport.debug = true;  //this is optional, use it if you don't want to use a packet sniffer to check what the sent message was (httpTransport.requestDump)
    httpTransport.call(SOAP_ACTION, envelope); //send request
    //  SoapObject result=(SoapObject)envelope.getResponse();
    SoapObject result=(SoapObject)envelope.bodyIn; //get response
    return result;          
}
于 2012-06-19T11:57:13.433 回答
2

我不确定这是否与我刚刚遇到的问题相同。有多个调用,在真实设备上只有第一个可以工作,而其余的会因超时而失败。

每次通话后断开连接为我解决了问题:

transport.call(NAMESPACE + "#" +  soapAction, envelope);
transport.getServiceConnection().disconnect();
于 2012-12-14T13:52:55.560 回答
0

Make sure of the below two, 1) HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,60000); 60000 - timeout value 2) Use http://10.0.2.2 instead of http://localhost

于 2015-05-14T01:53:48.933 回答
0

在使客户端应用程序使用 Web 服务时,我使用 ksoap2 库遇到了完全相同的问题,您必须做的是在 AsyncTask 中执行所有网络访问操作。

我是我的情况,timeout_in_milliseconds有人建议传递给 HttpTransportSE 对象构造函数的参数对我不起作用。

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);

如果您以前从未使用过异步任务,请按照以下链接访问 android 文档,以便您开始使用。

异步任务文档

于 2017-03-12T18:23:47.283 回答
0

有趣的是,在增加/减少目标 API 和使用清单时,请确保您拥有 Internet 权限:

  <uses-permission android:name="android.permission.INTERNET" />

Android KSOAP2 抛出 SocketTimeoutException

于 2018-05-14T06:33:21.097 回答
0

2019更新!

在花了很长时间试图解决我的问题之后,我想发布我的发现:

  • 在模拟器中可以 100% 正常工作,但根本无法在我的手机上使用。(虽然模拟器需要IP地址在我的网络上进行服务,但它无法解析机器名称)

  • 在电话上运行时,呼叫总是SocketTimeoutException在线路执行后立即产生androidHttpTransport.call(soap_action,envelope)- 即使我会设置这样的超时,也没有“等待”:

    HttpTransportSE androidHttpTransport = new HttpTransportSE(wsdl_url,40000000)

  • 我一直在使用 kSOAP v2.5.2 并且感谢 mya 在之前的回复中我更改为ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar. 这并没有解决问题,但它确实改变了提供给Cleartext HTTP traffic not permitted

  • 然后可以通过将此行添加到 AndoidManifest.xml 的 Application 部分来轻松解决此问题:

    android:usesCleartextTraffic="true"

我还必须禁用 Google Play Protect 才能允许从 APK 安装

我的项目的ZIP,以防你想看。它包括一个公共互联网网络服务 ( http://www.dneonline.com/calculator.asmx ),它应该适用于任何人。另一个按钮调用本地服务,因此您将失败。有很多注释行我需要让我达到这一点 - 被忽略!

于 2019-04-06T14:04:44.663 回答
0

如果有人仍然遇到这种情况,我的情况是从 ksoap2-android-2.5.2.jar 更改为 ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar 停止抛出 SocketTimeoutException

于 2017-11-02T10:32:52.590 回答
0

由于以下原因,我得到了SocketTimeOutExceptions :

  • 无效的 NAMESPACE、METHOD_NAME、SOAP_ACTION、URL
  • 网络连接问题

添加

HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL,600000);

或者

 HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL);

两者都没有什么大的区别。

最后,我在Liaqat建议的异步任务的帮助下修复了它。有关更多详细信息,请查看我的GitHub 项目以使用Ksoap2进行SOAP Demo

于 2017-03-21T09:07:26.620 回答
-2

在 OnCreate 中添加以下代码:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
于 2017-08-08T09:47:13.500 回答