在android中使用kso ap2的SocketTimeoutException

问题描述 投票:0回答:10

我看到了类似的问题,但我没有找到答案。我正在使用kso​​ap2库连接网络服务器,有时我得到了异常java.net.SocketTimeoutException:读取超时。

这是我的代码:

    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;
    }

我可以更改socket的超时或我可以做什么?

android ksoap2 socketexception
10个回答
2
投票

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

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;          
}

-2
投票

在OnCreate中添加以下代码:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

2
投票

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

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

transport.call(NAMESPACE + "#" +  soapAction, envelope);
transport.getServiceConnection().disconnect();

2
投票

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

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);

0
投票

确保以下两个,1)HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,60000); 60000 - 超时值2)使用http://10.0.2.2而不是http://localhost


0
投票

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

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

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);

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

AsyncTask documentation


0
投票

我有SocketTimeOutExceptions,原因如下:

  • 无效的NAMESPACE,METHOD_NAME,SOAP_ACTION,网址
  • 网络连接问题

添加

HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL,600000);

要么

 HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL);

两者都没有太大的区别。

最后,我用Liaqat建议的异步任务帮助修复了它。更多细节使用GitHub project检查我的SOAP Demo for Ksoap2


0
投票

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


0
投票

有趣的是,在增加/减少目标API和玩清单的同时,请确保您拥有互联网权限:

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

Android KSOAP2 throws SocketTimeoutException


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),应该适用于任何人。另一个按钮调用本地服务,因此将失败。有很多注释掉的线条,我需要让我到达这一点 - 被忽略!

© www.soinside.com 2019 - 2024. All rights reserved.