2012-09-27 20 views
6

मुझे कुछ अजीब समस्या का सामना करना पड़ रहा है, जब मैं 3 जी सेवा पर स्विच करता हूं तो केवल मेरा एप्लीकेशन काम नहीं कर रहा है (प्रॉक्सी के साथ) लेकिन यह वाईफ़ाई और 3 जी (प्रॉक्सी के बिना) में बहुत अच्छा काम कर रहा है।वाईफ़ाई और 3 जी (प्रॉक्सी के बिना) पर काम कर रहे एंड्रॉइड एप्लिकेशन, लेकिन 3 जी पर काम नहीं कर रहे हैं (अगर प्रॉक्सी और पोर्ट असाइन किया गया है)

डिफ़ॉल्ट प्रॉक्सी और पोर्ट मेरी स्टारहब (नेटवर्क प्रदाता) द्वारा दिया:

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, element, mHandler, 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, port, file, timeout); 
      serviceConnection.setRequestProperty("Connection", "keep-alive"); 
     } 
     return serviceConnection; 
    } 
} 

}

और मेरे एसएसएल कोड है::

यहाँ मेरी कोड है

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) 

अतिरिक्त जानकारी: सभी अन्य अनुप्रयोगों 3 पर चल रहे हैं जी नेटवर्क (प्रॉक्सी सेटिंग्स के साथ/बिना) और मेरे आवेदन में केवल एसओएपी अनुरोध काम नहीं कर रहा है।

मैंने सभी संभावित मामलों की कोशिश की है, लेकिन कोई भाग्य नहीं है। कृपया मुझे कुछ इनपुट प्रदान करें।

अग्रिम धन्यवाद।

उत्तर

6

शायद बहुत देर हो चुकी है, लेकिन मुझे आशा है कि इससे भविष्य में लोग मेरे जैसे यहां पहुंचने में मदद करेंगे, एक ही समस्या के साथ पागल हो जाएंगे।

यह एक एंड्रॉइड बग है। सब कुछ वाईफाई के साथ सही काम करता है, लेकिन यह 3 जी पर दुर्घटनाग्रस्त हो जाता है। यह 4.1 पर मेरे साथ हुआ, लेकिन 4.2.2 पर कोई समस्या नहीं थी।

इसे हल करने के लिए, आप फ़ाइल org.ksoap2.transport.HttpTransportSE को संशोधित करने के लिए है (मैं एक नया एक बढ़ाया और यह MyHttpTransportSE क्योंकि मैं ksoap2 विधानसभा जार उपयोग कर रहा हूँ कहा जाता है)। बस लाइन

//connection.setRequestProperty("Connection", "close"); 
बेशक

बाहर टिप्पणी विधि सार्वजनिक शून्य कॉल (स्ट्रिंग soapAction, SoapEnvelope लिफाफा) ओवरराइड, आप एसएसएल के साथ काम कर रहे हैं तो आप से अपने खुद के HttpsTransportSE का विस्तार करने की आवश्यकता होगी आपका नया MyHttpTransportSE

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-

+0

यह मेरी समस्या हल। इसे आईएमओ स्वीकार किया जाना चाहिए। –