Android应用程序在WIFI和3G(无代理)上运行,但不在3G上运行(如果分配了代理和端口)

我面临一些奇怪的问题,当我切换到3G服务(使用代理)时,只有我的应用程序无法工作,但它在WIFI和3G(没有代理)方面工作得很好.

我的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-

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...