2011-01-02 21 views
16

जब मैं HttpClient को को यूआरएल से कनेक्ट करने का उपयोग करने का प्रयास करता हूं तो मैं किसी समस्या में भाग रहा हूं। एक कनेक्शन टाइमआउट सेट करने के बाद भी, HTTP कनेक्शन में समय-समय पर अधिक समय लग रहा है।http कनेक्शन टाइमआउट समस्या

int timeoutConnection = 5000; 
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 

int timeoutSocket = 5000; 
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

यह ज्यादातर समय सही काम करता है। हालांकि, हर बार एक बार, http कनेक्शन हमेशा के लिए चलता है और setconnectiontimeout को अनदेखा करता है, जब फोन वाईफ़ाई से कनेक्ट होता है, और फ़ोन निष्क्रिय हो रहा था।

तो फ़ोन निष्क्रिय होने के बाद, पहली बार जब मैं कनेक्ट करने का प्रयास करता हूं, तो http कनेक्शन setconnectiontimeout को अनदेखा करता है और इसे रद्द करने के बाद हमेशा के लिए चलता है और फिर कोशिश करता है, यह हर बार आकर्षण की तरह काम करता है। लेकिन वह एक बार जो काम नहीं करता है, यह threadtimeout त्रुटि बनाता है, मैंने एक अलग थ्रेड का उपयोग करने की कोशिश की, यह काम करता है, लेकिन मुझे पता है कि थ्रेड लंबे समय तक चल रहा है।

मैं समझता हूं कि वाईफ़ाई निष्क्रिय होने पर सो जाता है, लेकिन मुझे नहीं पता कि यह setconnectiontimeout को अनदेखा क्यों कर रहा है।

कोई भी मदद कर सकता है, आईडी वास्तव में सराहना की।

+0

आप किस मंच के बारे में बात कर रहे हैं? –

+0

HTTP कनेक्शन अपने टाइमआउट को "अनदेखा" कर सकता है क्योंकि यह वास्तव में सोचता है कि यह कनेक्ट है, उदा। प्रारंभिक हैंडशेक सफल हुआ लेकिन पाइप (या आपके मामले में, हवा) से कुछ और नहीं आता है। हो सकता है कि आपके फोन में कनेक्शन स्वीकार करने की प्रवृत्ति हो लेकिन निष्क्रिय होने पर तुरंत उनके बारे में भूल जाए। इस समस्या से पहले आदान-प्रदान किए गए व्यक्तिगत फ्रेम को कैप्चरिंग और जांचना शायद अधिक कुछ बताएगा। –

उत्तर

0

आप समय-समय पर स्वयं का प्रबंधन कर सकते हैं, इस तरह आप भरोसा कर सकते हैं कि इससे कोई फर्क नहीं पड़ता कि कनेक्शन कब तक आता है, जब तक आपको स्वीकार्य प्रतिक्रिया न मिल जाए, कि आपका टाइमआउट आग लगेगा और http अनुरोध निरस्त कर दिया जाएगा।

+0

सबसे पहले, आपकी मदद के लिए धन्यवाद दोस्तों। @ अरहिम, मैंने कोशिश की, यह काम नहीं किया। – Mark

+0

मैंने एक परीक्षण चलाया, मैंने अपने फोन को वाईफ़ाई से कनेक्ट किया जिसमें इंटरनेट नहीं है, और मैंने आपके ट्यूब ऐप पर क्लिक किया। यह पता लगाने में 30 सेकंड लग गए कि मेरे ऐप की तरह कोई कनेक्शन नहीं है। यह मुझे पागल कर रहा है, जिस तरह से टाइमआउट कनेक्शन को अनदेखा कर रहा है। – Mark

+1

ऐसा इसलिए है क्योंकि वाईफाई पर इंटरनेट तक पहुंच के बिना, यदि आपका यूआरएल होस्टनाम के लिए है और प्रत्यक्ष आईपी एड्रेस नहीं है, तो कनेक्शन भी नहीं बनाया जा रहा है; जिस समय आप प्रतीक्षा कर रहे हैं वह मेजबाननाम को हल करने का प्रयास कर रहा है। – Chochos

10

सुनिश्चित नहीं है कि यह आपकी मदद करता है, हालांकि मुझे लगता है कि यह यहां साझा करने लायक है।

// the timeout until a connection is established 
private static final int CONNECTION_TIMEOUT = 5000; /* 5 seconds */ 

// the timeout for waiting for data 
private static final int SOCKET_TIMEOUT = 5000; /* 5 seconds */ 

// ----------- this is the one I am talking about: 
// the timeout until a ManagedClientConnection is got 
// from ClientConnectionRequest 
private static final long MCC_TIMEOUT = 5000; /* 5 seconds */ 

... 

HttpGet httpGet = new HttpGet(url); 
setTimeouts(httpGet.getParams()); 

... 

private static void setTimeouts(HttpParams params) { 
    params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 
     CONNECTION_TIMEOUT); 
    params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT); 
    params.setLongParameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT); 
} 
+1

एंड्रॉइड 2.01. सबसे पहले, आपकी मदद के लिए धन्यवाद दोस्तों। @ अरहिम, मैंने कोशिश की, हालांकि यह धन्यवाद नहीं हुआ। समस्या केवल इन शर्तों में से एक के तहत होती है: 1 - अगर मेरा फोन वाईफाई से जुड़ा हुआ है, और वाईफ़ाई के पास इंटरनेट का उपयोग नहीं है। इस मामले में टाइमआउट नहीं पकड़ा जा रहा है और इसमें लगभग 30 सेकंड लगते हैं। 2_ अगर फोन वाईफाई से जुड़ा हुआ है और वाईफ़ाई में इंटरनेट का उपयोग है। फोन कम से कम 2 मिनट के लिए निष्क्रिय होने के बाद, initail कनेक्शन टाइमआउट के लिए लगभग 30 सेकंड लेता है। हर दूसरे प्रयास, पूरी तरह से काम करता है। – Mark

+1

@ मार्क: यदि आपका ऐप मूल YouTube ऐप के समान व्यवहार करता है, तो मुझे लगता है कि आप अच्छी तरह से सो सकते हैं (मूल ऐप्स शीर्ष पेशेवरों द्वारा कोड हैं जो जितना संभव हो उतना एपीआई का उपयोग करने में सक्षम हैं)। कभी-कभी ऐसे मामले होते हैं जो हमारे नियंत्रण से बाहर होते हैं। एक और सांत्वनापूर्ण नोट - उदाहरण के लिए, ब्लैकबेरी की तुलना करने के लिए 30 सेकेंड इतना नहीं है, जहां आपके पास 2 मिनट हैं और आप इसे बदल नहीं सकते हैं। ;) –

0

मैं एंड्रॉयड पर समय समाप्ति के साथ इसी तरह के मुद्दों लिया है: टाइमआउट सामान मैंने पाया के साथ खेल जबकि वहाँ एक तिहाई समय समाप्ति प्रकार आप निर्दिष्ट कर सकते हैं। इसे हल करने के लिए मैंने जो किया था, उसे कमांड का इस्तेमाल किया गया था ताकि फोन को निष्क्रिय करने की अनुमति न दे, जबकि मैं कनेक्शन स्थापित करने का प्रयास कर रहा था और कनेक्शन के किसी भी पाठ या लिखने के दौरान। यह शायद इस मामले में एक शॉट के लायक है।

0

हालांकि मैंने इसे एंड्रॉइड प्लेटफॉर्म पर नहीं देखा है, लेकिन मैंने अन्य प्लेटफार्मों पर समान चीजें देखी हैं और इन मामलों में समाधान टाइमआउट को प्रबंधित करना है। जब आप अपना अनुरोध करते हैं तो एक और थ्रेड (टाइमआउट थ्रेड) को हटा दें। टाइमआउट थ्रेड आवश्यक समय की गणना करता है। यदि कोई डेटा प्राप्त करने से पहले टाइमआउट समाप्त हो जाता है, तो टाइमआउट थ्रेड मूल अनुरोध को रद्द कर देता है और आप एक नए अनुरोध के साथ पुनः प्रयास करते हैं। कोड करने के लिए कठिन है, लेकिन कम से कम आप जानते हैं कि यह काम करेगा।

0

आप से स्निपेट यह अंततः स्पष्ट नहीं है कि आप HttpClient.executeMethod(..) पर कॉल करने से पहले टाइमआउट सेट करते हैं। तो यह मेरा अनुमान है।

0

ठीक है, अगर आप किसी अन्य एप्लिकेशन को निष्क्रिय/मल्टीटास्क करते हैं, तो आपके थ्रेड को चलाना बंद कर दिया जा सकता है। हो सकता है कि आप के बजाय एक सेवा के अंदर कनेक्शन कोड रखना चाहिए ?:

http://developer.android.com/reference/android/os/AsyncTask.html http://developer.android.com/reference/android/app/IntentService.html

0

कैसे आप HTTP कनेक्शन बना रहे हैं? यह एक थ्रेडिंग मुद्दे की तरह दिखता है। यदि आप पृष्ठभूमि थ्रेड का उपयोग कर रहे हैं, तो थ्रेड को किसी भी टाइमआउट के साथ मार दिया जा सकता है। तथ्य यह है कि यह अगली बार काम करता है मुझे बताता है कि यदि आप एंड्रॉइड घटक में कॉल करते हैं और WAKE_LOCK को स्वयं प्रबंधित करते हैं तो आपका कोड काम करेगा। वैसे भी कृपया कॉलिंग तंत्र के बारे में अधिक जानकारी पोस्ट करें?

1
Thread t=new Thread() 
{ 
    public void run() 
    { 
    try 
    { 
     Thread.sleep(absolutetimeout); 
     httpclient.getConnectionManager().closeExpiredConnections(); 
     httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS); 
     httpclient.getConnectionManager().shutdown(); 
     log.debug("We shutdown the connection manager!"); 
    } 
    catch(InterruptedException e) 
    {} 
    } 
}; 

t.start(); 
HttpResponse res= httpclient.execute(httpget); 
t.interrupt(); 

क्या आप सभी जो सुझाव दे रहे हैं उसके आधार पर क्या यह है?

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

+0

वास्तव में, यह या तो काम नहीं करता प्रतीत होता है।क्या मुझे निष्पादन को अपने धागे में रखना है, क्योंकि मैं वास्तव में ऐसा नहीं करना चाहता हूं। क्या इसे मारने का कोई रास्ता नहीं है? –

1

मुझे एक ही समस्या मिली है, मुझे लगता है कि एंड्रॉइड इस पैरामीटर का समर्थन नहीं करता है। मेरे मामले में मैं ThreadSafeClientConnManager

params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(20)); 
params.setIntParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 200); 
params.setLongParameter(ConnManagerPNames.TIMEOUT, 10); 
ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager(params); 

पहले और दूसरे ठीक काम के लिए सभी तीन पैरामीटर परीक्षण किया है, लेकिन तीसरे के रूप में दस्तावेज काम नहीं किया। कोई अपवाद फेंक दिया गया था और जब execHttpClient # execute() निष्पादित किया गया था तो निष्पादन थ्रेड अनिश्चित काल तक अवरुद्ध कर दिया गया था।

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e650
देख "... एक एक सकारात्मक मूल्य के लिए 'http.conn-manager.timeout' की स्थापना करके कनेक्शन अनुरोध आपरेशन में अनिश्चित काल के लिए ब्लॉक नहीं करता कनेक्शन प्रबंधक सुनिश्चित कर सकते हैं। कनेक्शन अनुरोध सर्विस्ड नहीं किया जा सकता है दी गई अवधि अवधि के भीतर कनेक्शनपूलटाइमआउट अपवाद फेंक दिया जाएगा। "

0

समस्या अपाचे HTTP क्लाइंट में हो सकती है। HTTPCLIENT-1098 देखें। 4.1.2 में फिक्स्ड।

टाइमआउट अपवाद लॉगिंग उद्देश्यों के लिए, आईपी को रिवर्स करने का प्रयास करता है। अपवाद वास्तव में निकाल दिया जाता है जब तक यह एक अतिरिक्त समय लगता है।

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