2011-08-31 10 views
6

मेरे कोड यहाँ है:सेट कनेक्शन समयबाह्य साथ SSLSocketFactory द्वारा SSLSocket बनाएं

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(null, getAllCerts(), new SecureRandom()); 
SSLSocketFactory factory = sslContext.getSocketFactory(); 
mSocket = (SSLSocket) factory.createSocket("myhost.com", socketPort[index]); 

मैं बंदरगाहों में से तालिका की जाँच करें और खुले एक का चयन करना है। सब ठीक काम करता है, लेकिन createSocket() पर मेरा आवेदन बहुत समय खो देता है। अगर मेरे पास 5 बंदरगाह हैं और आखिरी खुली कनेक्टिंग में लगभग 3 मिनट लगते हैं।

मैं कनेक्शन को तेज करने के लिए SSLSocketFactory पर टाइमआउट कैसे सेट कर सकता हूं?

+0

में दी गई मैं काफी यकीन है कि कैसे आप लाने के लिए उम्मीद नहीं कर रहा हूँ का उपयोग कर सकते टाइमआउट सेट करके कनेक्ट करने की प्रक्रिया को ऊपर उठाएं। आपका कोड कहां चलाता है? एक AsyncTask में? एक सेवा में? कोई प्रारंभिक डेटा स्थानान्तरण? क्या आपने SSLSessionCache पर विचार किया था? –

+0

क्या आपको कोई समाधान मिला? मुझे एक ही समस्या का सामना करना पड़ रहा है, और यदि आप अपना समाधान पोस्ट कर सकते हैं तो यह बहुत अच्छा होगा ... अग्रिम धन्यवाद –

उत्तर

2

बजाय एक मौजूदा सॉकेट लपेटकर का प्रयास करें:

Socket socketConn = new Socket(); 
socketConn.connect(addr, DEFAULT_CONNECT_TIMEOUT); 
mSocket = socketConn.getSocketFactory().createSocket(socketConn, hostname, port, true); 
+2

क्या आपने इसका परीक्षण किया? मैं सॉकेट को पहले बंद करने के लिए अपनी आखिरी पंक्ति में createSocket() विधि की अपेक्षा करता हूं, क्योंकि यह पहले से कनेक्ट (गैर-एसएसएल) स्थिति में है। साथ ही, दस्तावेज़ों के मुताबिक, एसएसएल सॉकेट फैक्ट्रीज निर्दिष्ट एसएसएल हैंडशेक टाइमआउट के साथ एसएसएल प्रोटोकॉल कनेक्शन स्थापित करने के बाद अंतर्निहित सॉकेट टाइमआउट 0 (उर्फ नो टाइमआउट) को रीसेट कर देता है। –

+1

@ClassStacker आप गलत हैं। मैंने यह किया है यह काम करता हैं। (1) इस प्रकार आप एसएमटीपी, एलएसएपी, आदि के STARTTLS कमांड को कार्यान्वित करते हैं, इसलिए आपको जावामेल, जेएनडीआई एलडीएपी प्रदाता, आदि के अंदर एक ही चीज़ मिल जाएगी। (2) यह एक कनेक्ट टाइमआउट है, न कि एक रीड टाइमआउट, आपकी अंतिम वाक्य क्या है। (3) कृपया उस दावे के लिए एक संदर्भ उद्धृत करें। सॉकेट से विरासत में प्राप्त विधियों के संदर्भ के रूप में बाद के मामले को छोड़कर, 'टाइमआउट' शब्द जेएसडोक में SSLSocketFactory * या * SSLSocket के लिए प्रकट नहीं होता है। – EJP

+0

मेरे मामले में काम नहीं करता है क्योंकि मुझे यह सुनिश्चित करने की आवश्यकता है कि सॉकेट किसी निश्चित नेटवर्क से बंधे हों। 'नई सॉकेट()' सॉकेट के साथ अभी भी डिफ़ॉल्ट नेटवर्क से जुड़ जाएगा। – winklerrr

6

मामले में आप अभी भी सोच रहे हैं, तो आप विचार https://groups.google.com/forum/#!topic/android-developers/EYtMO5WoXXI

import javax.net.ssl.SSLSocketFactory; 

// Create a socket without connecting 
SSLSocketFactory socketFactory = SSLSocketFactory.getDefault(); 
Socket socket = socketFactory.createSocket(); 

// Connect, with an explicit timeout value 
socket.connect(new InetSocketAddress(endpoint.mServer, 
endpoint.mPort), CONNECT_TIMEOUT); 
+1

यह मेरे लिए चाल है! कनेक्शन के बिना सॉकेट बनाने की संभावना के बारे में नहीं सोचा था। – winklerrr

संबंधित मुद्दे