मैं एंड्रॉयड (2.3.x) पर एक ThreadSafeClientConnManager
साथ DefaultHttpClient
उपयोग कर रहा हूँ एक मेरी बाकी सर्वर से HTTP अनुरोध भेजने के लिए (एम्बेडेड जेट्टी)।DefaultHttpClient आधा बंद सॉकेट पर डेटा क्यों भेजता है?
निष्क्रिय समय की ~ 200 सेकंड के बाद, सर्वर एक [फिन] के साथ TCP कनेक्शन बंद कर देता है। एंड्रॉइड क्लाइंट एक [एसीके] के साथ प्रतिक्रिया करता है। यह सॉकेट को आधे बंद राज्य में छोड़ देना चाहिए (सर्वर अभी भी सुन रहा है, लेकिन डेटा नहीं भेज सकता है)।
मैं उम्मीद होती है कि जब ग्राहक फिर से उस कनेक्शन का उपयोग करने (HttpClient.execute
के माध्यम से), DefaultHttpClient
आधा बंद स्थिति का पता लगाने जाएगा कोशिश करता है, ग्राहक के पक्ष (इस प्रकार भेजने यह है पर सॉकेट बंद [फिन/एसीके] को अंतिम रूप देने बंद करें), और अनुरोध के लिए एक नया कनेक्शन खोलें। लेकिन, रगड़ है।
इसके बजाय, यह आधा बंद सॉकेट से अधिक नए HTTP अनुरोध भेजता है। भेजने के बाद ही आधे बंद राज्य का पता चला है और सॉकेट क्लाइंट-साइड पर बंद हो गया है (सर्वर पर भेजे गए [FIN] के साथ)। बेशक, सर्वर अनुरोध का जवाब नहीं दे सकता (यह पहले से ही [एफआईएन] भेज चुका था), इसलिए ग्राहक सोचता है कि अनुरोध विफल हुआ और स्वचालित रूप से एक नई सॉकेट/कनेक्शन के माध्यम से पुनः प्रयास करता है।
अंतिम परिणाम है कि सर्वर को देखता है और अनुरोध की दो प्रतियां प्रक्रियाओं है।
इसे ठीक करने के तरीके पर कोई विचार? (मेरा सर्वर दूसरी प्रतिलिपि के साथ सही चीज करता है, लेकिन मुझे परेशान है कि पेलोड दो बार प्रसारित किया जाता है।)
डिफ़ॉल्ट नहीं होना चाहिए डिफ़ॉल्ट एचटीपी क्लाइंट का पता लगाना चाहिए कि सॉकेट बंद था जब यह पहली बार नई HTTP पैकेट लिखने की कोशिश करता था, तुरंत उस सॉकेट को बंद करें, और एक नया शुरू करें? सर्वर के एक [एफआईएन] भेजे जाने के बाद सॉकेट मिनटों पर एक नया HTTP अनुरोध कैसे भेजा जाता है, इस बारे में मैं परेशान हूं।
'AndroidHttpClient' ठीक उसी व्यवहार (एक' ThreadSafeClientConnManager' साथ अर्थात एक 'DefaultHttpClient' धागा सुरक्षा सुनिश्चित करने के) करता है ... शायद आप कि उपयोग करने का प्रयास कर सकते हैं? मुझे सॉकेट कनेक्शन कैसे काम करता है, इस बारे में विवरण के बारे में बहुत कुछ नहीं पता, लेकिन सिर्फ एक सुझाव ... –