我看到了类似的问题,但我没有找到答案。我正在使用ksoap2库连接网络服务器,有时我得到了异常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的超时或我可以做什么?
当服务没有响应或者可能存在网络连接问题时,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;
}
在OnCreate中添加以下代码:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
我不确定这是否与我刚才遇到的问题相同。有多个呼叫,在真实设备上只有第一个可以工作,而其余的则会因超时而失败。
每次通话后断开连接都解决了我的问题:
transport.call(NAMESPACE + "#" + soapAction, envelope);
transport.getServiceConnection().disconnect();
您可以通过提供Web服务需要响应的平均时间来控制超时异常。
HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);
确保以下两个,1)HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,60000); 60000 - 超时值2)使用http://10.0.2.2而不是http://localhost
在使客户端应用程序使用Web服务时,使用ksoap2库时遇到了完全相同的问题,您必须做的是在AsyncTask中执行所有网络访问操作。
我是我的情况,有人建议传递给HttpTransportSE对象构造函数的timeout_in_milliseconds
参数对我不起作用。
HttpTransportSE httpTransport = new HttpTransportSE(URL, timeout_in_millsecond);
如果您之前从未使用过异步任务,请按照以下链接访问android文档,以便您可以开始使用。
我有SocketTimeOutExceptions,原因如下:
添加
HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL,600000);
要么
HttpTransportSE androidhttpsTransportSE=new HttpTransportSE(URL);
两者都没有太大的区别。
最后,我用Liaqat建议的异步任务帮助修复了它。更多细节使用GitHub project检查我的SOAP Demo for Ksoap2
如果有人还遇到这个,我的情况是从ksoap2-android-2.5.2.jar改为ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar停止抛出SocketTimeoutException
有趣的是,在增加/减少目标API和玩清单的同时,请确保您拥有互联网权限:
<uses-permission android:name="android.permission.INTERNET" />
花了很长时间试图解决我的问题,我想发布我的发现:
SocketTimeoutException
线后,调用总是立即产生一个androidHttpTransport.call(soap_action,envelope)
- 即使我设置了这样的超时,也没有'等待':
HttpTransportSE androidHttpTransport = new HttpTransportSE(wsdl_url,40000000)
ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar
。这并没有解决问题但它确实改变了提供给Cleartext HTTP traffic not permitted
的错误消息android:usesCleartextTraffic="true"
此外,我必须禁用Google Play Protect以允许从APK安装
ZIP我的项目,如果你想看到。它包括一个公共互联网网络服务(http://www.dneonline.com/calculator.asmx),应该适用于任何人。另一个按钮调用本地服务,因此将失败。有很多注释掉的线条,我需要让我到达这一点 - 被忽略!