Android调用WebService遇java.net.SocketTimeoutException问题求助
解决Android调用WebService时的SocketTimeoutException问题
以下是针对你遇到的超时问题的具体排查和解决步骤:
1. 修复本地地址访问问题
你代码中使用的http://localhost:8090/WebService1.asmx在Android设备/模拟器中无法正确指向你的开发电脑:
- 若使用Android模拟器,替换地址为
http://10.0.2.2:8090/WebService1.asmx(这是模拟器映射主机localhost的专用地址) - 若使用真机测试,替换为你开发电脑的局域网IP(例如
http://192.168.1.100:8090/WebService1.asmx),同时确保手机与电脑在同一局域网,且电脑防火墙允许8090端口的入站请求。
2. 增加超时时间
默认HttpTransportSE的超时时间较短,容易导致请求未完成就触发超时。创建实例时显式设置更长的超时(单位:毫秒):
httpTransportSE = new HttpTransportSE(URL, 15000); // 设置15秒超时
3. 补充必要的网络配置
- 在
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 若你的设备是Android 9及以上版本,默认禁止明文HTTP请求,需要在
<application>标签中添加允许配置:android:usesCleartextTraffic="true"
4. 验证WebService可用性
先通过浏览器或Postman访问http://localhost:8090/WebService1.asmx,确认WebService服务正常运行、能响应请求,排除服务本身的问题。
修改后的示例代码
package com.example.acr_soaptest2; import android.util.Log; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; public class ServiceManager { private static final String METHOD_NAME = "MySQl_Query"; private static final String NAMESPACE = "http://tempuri.org/"; private static final String SOAP_ACTION = "http://tempuri.org/MySQl_Query"; // 替换为适配设备的正确地址 private static final String URL = "http://10.0.2.2:8090/WebService1.asmx"; SoapObject soapObject; SoapSerializationEnvelope soapSerializationEnvelope; HttpTransportSE httpTransportSE; public void PushData(String query) { soapObject = new SoapObject(NAMESPACE, METHOD_NAME); soapObject.addProperty("sorgu", query); soapSerializationEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); soapSerializationEnvelope.dotNet = true; soapSerializationEnvelope.setOutputSoapObject(soapObject); // 设置15秒超时 httpTransportSE = new HttpTransportSE(URL, 15000); httpTransportSE.debug = true; try { httpTransportSE.call(SOAP_ACTION, soapSerializationEnvelope); SoapPrimitive soapPrimitive=(SoapPrimitive)soapSerializationEnvelope.getResponse(); System.out.println(soapPrimitive.toString()); Log.d("satir:", soapPrimitive.toString()); } catch (Exception ex) { ex.printStackTrace(); Log.d("satir:", ex.toString()); } } }
内容的提问来源于stack exchange,提问作者user10823899
相关产品推荐
相关产品推荐

