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

前端之家收集整理的这篇文章主要介绍了Android应用程序在WIFI和3G(无代理)上运行,但不在3G上运行(如果分配了代理和端口)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我面临一些奇怪的问题,当我切换到3G服务(使用代理)时,只有我的应用程序无法工作,但它在WIFI和3G(没有代理)方面工作得很好.

我的Starhub(网络提供商)提供的默认代理和端口:

  1. Proxy: 10.12.1.2
  2. Port: 80

对于数据,我正在向我的网络服务器发送肥皂请求.

这是我的代码

  1. public class SearchThread extends Thread {
  2. private String mUrl;
  3. private SoapSerializationEnvelope mEnvelop;
  4. private Handler mHandler;
  5. private String mSoapAction;
  6. private KeepAliveHttpsTransportSE mTransport;
  7.  
  8. public SearchThread(String url) {
  9. this.mUrl = url;
  10. }
  11.  
  12. @Override
  13. public void run() {
  14. mEnvelop = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);
  15. mEnvelop.setOutputSoapObject(interfaceListener.getSoapObject(element));
  16. mSoapAction = interfaceListener.getSoapAction(element);
  17. try {
  18. TrustManagerManipulator.allowAllSSL();
  19. mTransport = new KeepAliveHttpsTransportSE(URLS.URL_MAIN,443,mUrl,60000);
  20. mTransport.call(mSoapAction,mEnvelop);
  21. if (this.isInterrupted()) {
  22. Log.v(TAG,"Interrupted");
  23. return;
  24. }
  25. recevedSoapResponse(mEnvelop.getResponse());
  26. } catch (SocketException ex) {
  27. Log.e("Error : ","Error on soapPrimitiveData() " + ex.getMessage());
  28. ex.printStackTrace();
  29. } catch (IOException e) {
  30. interfaceListener.recievedParsingResults(
  31. PARSER.RESULT.CONNECTION_Failed,element,mHandler,mView);
  32. e.printStackTrace();
  33. } catch (XmlPullParserException e) {
  34. e.printStackTrace();
  35. interfaceListener.recievedParsingResults(
  36. PARSER.RESULT.INTERNAL_ERROR,mView);
  37. }
  38. }
  39. private void recevedSoapResponse(Object response) {
  40. //Parsing XML here.
  41. }
  42. public class KeepAliveHttpsTransportSE extends HttpsTransportSE
  43. {
  44. private final String host;
  45. private final int port;
  46. private final String file;
  47. private final int timeout;
  48. private ServiceConnection serviceConnection;
  49.  
  50. public KeepAliveHttpsTransportSE (String host,int port,String file,int timeout) {
  51. super(host,port,file,timeout);
  52. this.host = host;
  53. this.port = port;
  54. this.file = file;
  55. this.timeout = timeout;
  56. }
  57. //@Override
  58. public ServiceConnection getServiceConnection() throws IOException
  59. {
  60. if (serviceConnection == null) {
  61. serviceConnection = new HttpsServiceConnectionSE(host,timeout);
  62. serviceConnection.setRequestProperty("Connection","keep-alive");
  63. }
  64. return serviceConnection;
  65. }
  66. }

}

这是我的SSL代码

  1. public class TrustManagerManipulator implements X509TrustManager {
  2. private static TrustManager[] trustManagers;
  3. private static final X509Certificate[] acceptedIssuers = new X509Certificate[] {};
  4.  
  5. public boolean isClientTrusted(X509Certificate[] chain) {
  6. return true;
  7. }
  8.  
  9. public boolean isServerTrusted(X509Certificate[] chain) {
  10. return true;
  11. }
  12.  
  13. public static void allowAllSSL() {
  14. HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
  15. public boolean verify(String hostname,SSLSession session) {
  16. return true;
  17. }
  18. });
  19. SSLContext context = null;
  20. if (trustManagers == null) {
  21. trustManagers = new TrustManager[] { new TrustManagerManipulator() };
  22. }
  23. try {
  24. context = SSLContext.getInstance("TLS");
  25. context.init(null,trustManagers,new SecureRandom());
  26. } catch (NoSuchAlgorithmException e) {
  27. e.printStackTrace();
  28. } catch (KeyManagementException e) {
  29. e.printStackTrace();
  30. }
  31. HttpsURLConnection.setDefaultSSLSocketFactory(context
  32. .getSocketFactory());
  33. }
  34.  
  35. public void checkClientTrusted(X509Certificate[] chain,String authType)
  36. throws CertificateException {
  37. }
  38.  
  39. public void checkServerTrusted(X509Certificate[] chain,String authType)
  40. throws CertificateException {
  41. }
  42.  
  43. public X509Certificate[] getAcceptedIssuers() {
  44. return acceptedIssuers;
  45. }
  46. }

例外:

  1. 09-27 12:21:03.295: W/System.err(8924): java.net.SocketException: Socket is closed
  2. 09-27 12:21:03.295: W/System.err(8924): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.checkOpen(OpenSSLSocketImpl.java:262)
  3. 09-27 12:21:03.295: W/System.err(8924): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:273)
  4. 09-27 12:21:03.295: W/System.err(8924): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
  5. 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
  6. 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477)
  7. 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:441)
  8. 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
  9. 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
  10. 09-27 12:21:03.295: W/System.err(8924): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
  11. 09-27 12:21:03.300: W/System.err(8924): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
  12. 09-27 12:21:03.300: W/System.err(8924): at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)
  13. 09-27 12:21:03.300: W/System.err(8924): at org.ksoap2.transport.HttpsServiceConnectionSE.openOutputStream(HttpsServiceConnectionSE.java:98)
  14. 09-27 12:21:03.300: W/System.err(8924): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:157)
  15. 09-27 12:21:03.300: W/System.err(8924): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
  16. 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)注释掉该行

  1. //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相关文章