मैंने पढ़ा है कि HttpURLConnection लगातार कनेक्शन का समर्थन करता है, ताकि एकाधिक अनुरोधों के लिए कनेक्शन का पुन: उपयोग किया जा सके। मैंने कोशिश की और दूसरी पोस्ट भेजने का एकमात्र तरीका ओपनकनेक्शन को दूसरी बार कॉल करके था। अन्यथा मुझे एक IllegalStateException मिला ("पहले से जुड़ा हुआ");HttpURLConnection कार्यान्वयन
try{
URL url = new URL("http://someconection.com");
}
catch(Exception e){}
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//set output, input etc
//send POST
//Receive response
//Read whole response
//close input stream
con.disconnect();//have also tested commenting this out
con = (HttpURLConnection) url.openConnection();
//Send new POST
दूसरा अनुरोध एक ही TCP कनेक्शन (wireshark के साथ सत्यापित किया) पर भेजने के है, लेकिन मैं क्यों नहीं समझ सकता (हालांकि यह जो मैं चाहता है) के बाद से मैं डिस्कनेक्ट कहा जाता है: मैं निम्नलिखित का इस्तेमाल किया। मैंने HttpURLConnection के लिए स्रोत कोड की जांच की है और कार्यान्वयन एक ही गंतव्य पर कनेक्शन के रखरखाव कैश रखता है। मेरी समस्या यह है कि मैं यह नहीं देख सकता कि मैंने पहला अनुरोध भेजने के बाद कैश में कनेक्शन कैसे रखा है। डिस्कनेक्ट कनेक्शन बंद कर देता है और डिस्कनेक्ट किए बिना, फिर भी मैं नहीं देख सकता कि कनेक्शन कैश में वापस कैसे रखा जाता है। मैंने देखा कि कैश में सभी निष्क्रिय कनेक्शनों पर जाने के लिए एक रन विधि है (मुझे यकीन नहीं है कि इसे कैसे कहा जाता है), लेकिन मुझे नहीं पता कि कैश में कनेक्शन कैसे वापस रखा गया है। ऐसा लगता है कि एकमात्र ऐसा स्थान httpClient की समाप्त विधि में है लेकिन इसे प्रतिक्रिया के साथ POST के लिए नहीं कहा जाता है। क्या कोई इस पर मेरी सहायता कर सकता है?
संपादित मेरे हित TCP कनेक्शन पुन: उपयोग के लिए एक HttpUrlConnection वस्तु की उचित हैंडलिंग क्या है, है। इनपुट/आउटपुट स्ट्रीम को url.openConnection() के बाद बंद किया जाना चाहिए; प्रत्येक बार नया अनुरोध भेजने के लिए (डिस्कनेक्ट() से परहेज)? यदि हां, तो मैं नहीं देख सकता कि कनेक्शन का पुन: उपयोग कैसे किया जा रहा है जब मैं url.openConnection() को दूसरी बार कॉल करता हूं, क्योंकि कनेक्शन को पहले अनुरोध के लिए कैश से हटा दिया गया है और यह नहीं पता कि यह वापस कैसे लौटाया जा सकता है। क्या यह संभव है कि कनेक्शन को keepalive कैश (बग?) पर वापस नहीं किया गया है, लेकिन ओएस ने अभी तक और नए कनेक्शन पर टीसीपी कनेक्शन जारी नहीं किया है, ओएस buffered कनेक्शन (अभी तक जारी नहीं किया गया) या कुछ समान देता है? EDIT2 केवल संबंधित मैंने पाया JDK_KeepAlive
... जब आवेदन InputStream URLConnection.getInputStream() द्वारा दिया पर करीब() कहता है, JDK के HTTP प्रोटोकॉल हैंडलर की कोशिश करेंगे से था कनेक्शन को साफ करने के लिए और यदि सफल है, तो भविष्य में HTTP अनुरोधों द्वारा पुन: उपयोग के लिए कनेक्शन को कनेक्शन कैश में डाल दें।
लेकिन मुझे यकीन नहीं है कि यह कौन सा हैंडलर है। sun.net.www.protocol.http.Handler कोई कैशिंग नहीं करता जैसा मैंने देखा धन्यवाद!
एक मामले में: http://stackoverflow.com/questions/2457538/several-requests-from-one-httpurlconnection?rq=1 मेरे मामले में मैं भी कई अनुरोध प्राप्त करने किसी भी get/post पैरामीटर के बिना मेरी php फ़ाइल में, जहां पैरामीटर प्राप्त करने के साथ केवल 1 अनुरोध है .... मुझे नहीं पता कि क्यों, अगर HttpURLConnection एक समय में एक अनुरोध भेजने के लिए है, तो सर्वर पर बहुत से अनुरोध भेजना ... – Bhuro