2011-04-13 9 views
11

के साथ एंड्रॉइड में एसएसएल सत्र का पुन: उपयोग करना मुझे एचटीपी क्लाइंट का उपयोग करके एंड्रॉइड पर एक एसएसएल सत्र फिर से शुरू करने में बहुत कठिनाई हो रही है।एचटीपी क्लाइंट

मैं हर 90 सेकंड में एक सर्वर को मतदान कर रहा हूं (यह केवल एक समारोह के साथ औद्योगिक उपकरणों के लिए है), इसलिए मुझे सत्र को फिर से शुरू करने की आवश्यकता है या अन्य डेटा को कुछ केबी से एक घंटे तक 150-200 केबी तक स्किरोकेट का उपयोग करना होगा, जो कि है अरक्षणीय। सर्वर जेटी को रीस्टलेट में एम्बेड किया गया है, और जब तक मैं इसे बता सकता हूं ओपनएसएसएल का उपयोग करके इसका परीक्षण करता हूं तो एसएसएल सत्रों की बहाली का समर्थन करता है।

मैं अपने एचटीपी क्लाइंट ऑब्जेक्ट का पुन: उपयोग कर रहा हूं, इसलिए ऐसा नहीं है। एंड्रॉइड में एक विशिष्ट SSLCertificateSocketFactory है जिसे मैंने भी कोशिश की है और यह भी काम नहीं कर रहा है।

क्या ऐसा कुछ है जो मैं पूरी तरह से याद कर रहा हूं? मैंने माना था कि एचटीपी क्लाइंट स्वचालित रूप से ऐसा करेगा, मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं, और इंटरनेट पर कोई भी ऐसी ही समस्या के खिलाफ नहीं आ रहा है।

मैं सेट कर लेते हैं httpclient के माध्यम से:

public HttpClient getNewHttpClient(Context context) { 
    try { 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 
     HttpConnectionParams.setStaleCheckingEnabled(params, false); 

     HttpConnectionParams.setConnectionTimeout(params, 4 * 1000); 
     HttpConnectionParams.setSoTimeout(params, 5 * 1000); 
     HttpConnectionParams.setSocketBufferSize(params, 8192); 

     HttpClientParams.setRedirecting(params, false); 

     SSLSessionCache sslSession = new SSLSessionCache(context); 
     SchemeRegistry registry = new SchemeRegistry(); 

     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", SSLCertificateSocketFactory.getHttpSocketFactory(10*60*1000, sslSession), 444)); 
     //registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 444)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     return new DelegateHttpClient(ccm, params); 

    } catch (Exception e) { 
     return new DefaultHttpClient(); 
    } 
} 

private static class DelegateHttpClient extends DefaultHttpClient { 

    private DelegateHttpClient(ClientConnectionManager ccm, HttpParams params) { 
     super(ccm, params); 
    } 

    @Override 
    protected HttpContext createHttpContext() { 

     HttpContext context = new BasicHttpContext(); 
     context.setAttribute(ClientContext.AUTHSCHEME_REGISTRY, getAuthSchemes()); 
     context.setAttribute(ClientContext.COOKIESPEC_REGISTRY, getCookieSpecs()); 
     context.setAttribute(ClientContext.CREDS_PROVIDER, getCredentialsProvider()); 

     CookieStore cookieStore = new BasicCookieStore(); // Create a local instance of cookie store 
     context.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 

     return context; 
    } 
    } 

(मैंने जान-बूझकर पोर्ट 444 का उपयोग कर रहा)

तो बस मैं एक साधारण HttpGet और बेसिक प्राधिकरण का उपयोग कर HttpClient वस्तु का पुन: उपयोग।

मैं यहाँ क्या गलत कर रहा हूं! कोई भी, कृपया मदद करें!

+0

'नया डिफॉल्ट एचटीपी क्लाइंट (सीसीएम, पैराम्स) लौटाएं;' - क्या यह 'नया प्रतिनिधि हैप्लेट क्लाइंट' होना चाहिए? – sarnold

+0

आह हाँ, मैं उम्र के लिए इसके साथ गड़बड़ कर रहा हूं, ओपी तय किया - यह समस्या नहीं है हालांकि – user705142

उत्तर

2

यह तय है। अब यह सत्र का उपयोग कर रहा है और डेटा की मात्रा में खपत कर रहा है।

registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

कि लाइन निकाला जा रहा है यह ठीक करता है, HttpClient के बावजूद कभी नहीं भी http/पोर्ट 80 का उपयोग करते हुए यह क्यों काम करता है मुझे पता नहीं है।

+0

एनबी: मुझे सरल कनेक्टर पर स्विच करने की भी आवश्यकता है - जेटी सत्रों के साथ काम नहीं कर रहा है। – user705142