我的Starhub(网络提供商)提供的默认代理和端口:
- Proxy: 10.12.1.2
- Port: 80
对于数据,我正在向我的网络服务器发送肥皂请求.
这是我的代码:
- public class SearchThread extends Thread {
- private String mUrl;
- private SoapSerializationEnvelope mEnvelop;
- private Handler mHandler;
- private String mSoapAction;
- private KeepAliveHttpsTransportSE mTransport;
- public SearchThread(String url) {
- this.mUrl = url;
- }
- @Override
- public void run() {
- mEnvelop = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);
- mEnvelop.setOutputSoapObject(interfaceListener.getSoapObject(element));
- mSoapAction = interfaceListener.getSoapAction(element);
- try {
- TrustManagerManipulator.allowAllSSL();
- mTransport = new KeepAliveHttpsTransportSE(URLS.URL_MAIN,443,mUrl,60000);
- mTransport.call(mSoapAction,mEnvelop);
- if (this.isInterrupted()) {
- Log.v(TAG,"Interrupted");
- return;
- }
- recevedSoapResponse(mEnvelop.getResponse());
- } catch (SocketException ex) {
- Log.e("Error : ","Error on soapPrimitiveData() " + ex.getMessage());
- ex.printStackTrace();
- } catch (IOException e) {
- interfaceListener.recievedParsingResults(
- PARSER.RESULT.CONNECTION_Failed,element,mHandler,mView);
- e.printStackTrace();
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- interfaceListener.recievedParsingResults(
- PARSER.RESULT.INTERNAL_ERROR,mView);
- }
- }
- private void recevedSoapResponse(Object response) {
- //Parsing XML here.
- }
- public class KeepAliveHttpsTransportSE extends HttpsTransportSE
- {
- private final String host;
- private final int port;
- private final String file;
- private final int timeout;
- private ServiceConnection serviceConnection;
- public KeepAliveHttpsTransportSE (String host,int port,String file,int timeout) {
- super(host,port,file,timeout);
- this.host = host;
- this.port = port;
- this.file = file;
- this.timeout = timeout;
- }
- //@Override
- public ServiceConnection getServiceConnection() throws IOException
- {
- if (serviceConnection == null) {
- serviceConnection = new HttpsServiceConnectionSE(host,timeout);
- serviceConnection.setRequestProperty("Connection","keep-alive");
- }
- return serviceConnection;
- }
- }
}
这是我的SSL代码:
- public class TrustManagerManipulator implements X509TrustManager {
- private static TrustManager[] trustManagers;
- private static final X509Certificate[] acceptedIssuers = new X509Certificate[] {};
- public boolean isClientTrusted(X509Certificate[] chain) {
- return true;
- }
- public boolean isServerTrusted(X509Certificate[] chain) {
- return true;
- }
- public static void allowAllSSL() {
- HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
- public boolean verify(String hostname,SSLSession session) {
- return true;
- }
- });
- SSLContext context = null;
- if (trustManagers == null) {
- trustManagers = new TrustManager[] { new TrustManagerManipulator() };
- }
- try {
- context = SSLContext.getInstance("TLS");
- context.init(null,trustManagers,new SecureRandom());
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (KeyManagementException e) {
- e.printStackTrace();
- }
- HttpsURLConnection.setDefaultSSLSocketFactory(context
- .getSocketFactory());
- }
- public void checkClientTrusted(X509Certificate[] chain,String authType)
- throws CertificateException {
- }
- public void checkServerTrusted(X509Certificate[] chain,String authType)
- throws CertificateException {
- }
- public X509Certificate[] getAcceptedIssuers() {
- return acceptedIssuers;
- }
- }
例外:
- 09-27 12:21:03.295: W/System.err(8924): java.net.SocketException: Socket is closed
- 09-27 12:21:03.295: W/System.err(8924): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.checkOpen(OpenSSLSocketImpl.java:262)
- 09-27 12:21:03.295: W/System.err(8924): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:273)
- 09-27 12:21:03.295: W/System.err(8924): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
- 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
- 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477)
- 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:441)
- 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
- 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
- 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
- 09-27 12:21:03.300: W/System.err(8924): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
- 09-27 12:21:03.300: W/System.err(8924): at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)
- 09-27 12:21:03.300: W/System.err(8924): at org.ksoap2.transport.HttpsServiceConnectionSE.openOutputStream(HttpsServiceConnectionSE.java:98)
- 09-27 12:21:03.300: W/System.err(8924): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:157)
- 09-27 12:21:03.300: W/System.err(8924): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
- 09-27 12:21:03.300: W/System.err(8924): at com.mobile.utils.parser.SearchThread.run(SearchThread.java:25)
附加信息:所有其他应用程序都在3G网络上运行(有/无代理设置),在我的应用程序中,只有SOAP请求不起作用.
我已经尝试了所有可能的情况,但没有运气.请给我一些意见.
提前致谢.
解决方法
这是一个Android错误.一切都适用于WiFi,但它在3G上崩溃.它发生在4.1上,但在4.2.2上没有问题.
要解决它,你必须修改文件org.ksoap2.transport.HttpTransportSE(我已经扩展了一个新文件,并将其命名为MyHttpTransportSE,因为我使用的是ksoap2程序集jar).
只需覆盖方法public void call(String soapAction,SoapEnvelope envelope)注释掉该行
- //connection.setRequestProperty("Connection","close");
当然,如果您正在使用SSL,则需要从新的MyHttpTransportSE扩展自己的HttpsTransportSE.
HttpTransportSE源代码:https://github.com/karlmdavis/ksoap2-android/blob/master/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java?source=c
HttpsTransportSE源代码:https://github.com/mosabua/ksoap2-android/blob/master/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java
更多细节:https://groups.google.com/forum/#!searchin/ksoap2-android/closed/ksoap2-