2012-06-19 76 views
0

我看到类似的问题,但我没有找到答案。 我正在使用kso​​ap2库与网络服务器连接,有时我得到了异常java.net.SocketTimeoutException:读取超时。在android中使用kso​​ap2的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; 
    } 

我可以改变的地方超时套接字或我能做些什么?

回答

2

当服务没有响应或者可能存在网络连接问题时,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;   
} 
+0

你可以告诉我什么是envelop.bodyIn()函数吗?是不是超时异常没有发生的原因 –

2

我不确定这是否是我刚才的同样的问题。有多个电话,在真实的设备上只有第一个可以工作,而其余的则会失败并伴随超时。

每次通话后断开解决了我的问题:)

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

不能正常工作.... \ –

+1

有些帮助或其他方式,谢谢!使用asynctask调用代码 –

2

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

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond); 
0

我有一个做客户端应用程序消耗Web服务时使用kso​​ap2库完全相同的问题,你必须做的是在执行的AsyncTask所有网络访问操作。

我是我的情况,有人建议传递给HttpTransportSE对象构造函数的timeout_in_milliseconds参数对我无效。

HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond); 

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

AsyncTask documentation

+0

。 –

0

我的原因如下SocketTimeOutExceptions

  • 无效的命名空间,METHOD_NAME,SOAP_ACTION,URL
  • 网络连接问题

添加

HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL,600000); 

HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL); 

都没有任何大的差别。

最后, 我异步任务的帮助固定它的建议通过Liaqat。对于更详细检查我的GitHub projectSOAP Demo使用Ksoap2

-2

在OnCreate中添加娄代码:

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

这是不好的建议,甚至不是解决问题的办法。 – laalto

0

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

相关问题