2010-07-28 23 views
31

मुझे पता है कि यह समस्या System.setProperty ("http.keepAlive", "false") के साथ तय की जानी चाहिए; openConnection से पहले, लेकिन यह मेरे लिए काम नहीं किया। सबसे पहले इस कोड काम पर प्रयास करें, दूसरा विफल रहता है। भले ही मैं 5 सेकंड से कम समय के बाद इस अनुरोध का प्रयास करता हूं, यह भी काम करता है। तो मुझे लगता है कि अधिक से अधिक प्रतीक्षा करें, इसे फिर सेHttpUrlConnection.openConnection दूसरी बार विफल रहता है

विफल रहता है यह मेरा कोड है:

System.setProperty("http.keepAlive", "false"); 
    HttpURLConnection conn = (HttpURLConnection) mURL.openConnection(); 
    conn.setUseCaches(false); 
    conn.setRequestProperty("Connection","Keep-Alive"); 
    conn.setRequestProperty("User-Agent", useragent); 
    conn.setConnectTimeout (30000) ; 
    conn.setDoOutput(true); 
     conn.setDoInput(true); 

    consumer.sign(conn); 
    InputSource is = new InputSource(conn.getInputStream()); 

मैं अंतिम पंक्ति पर अपवाद:

java.io.IOException: Write error: I/O error during system call, Broken pipe 
W/System.err(2164): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativewrite(Native Method) 
W/System.err(2164): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.access$600(OpenSSLSocketImpl.java:55) 
W/System.err(2164): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:583) 
W/System.err(2164): at java.io.OutputStream.write(OutputStream.java:82) 
W/System.err(2164): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.sendRequest(HttpURLConnectionImpl.java:1332) 
W/System.err(2164): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1656) 
W/System.err(2164): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649) 
W/System.err(2164): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1153) 
W/System.err(2164): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:253) 

किसी को यहाँ क्या गलत है के बारे में एक विचार है ?। धन्यवाद!

उत्तर

3

मैंने समस्या हल की। यहां मैं आपको कोड छोड़ देता हूं, अगर यह किसी के लिए सहायक हो सकता है। असल में मैं HttpUrlConnection की बजाय HttpClient/HttpGet का उपयोग करने के लिए Google पर एक प्रवृत्ति देखता हूं। इसलिए मैं उन वर्गों के साथ करने की कोशिश की, और सब कुछ काम किया:

final HttpClient client = new DefaultHttpClient(); 
final HttpGet conn = new HttpGet(mURL.toString()); 

OAuthConsumer consumer = mOAuthManager.getPostConsumer(); 
consumer.sign(conn); 
HttpResponse response = client.execute(conn); 
InputSource is = new InputSource(response.getEntity().getContent()); 
+10

गूगल अब HttpUrlConnection उपयोग करने के लिए सिफारिश की गई है उन कीड़े के कुछ के बाद से (जिंजरब्रेड से शुरू) के बाद है है निर्धारित किया गया: http: // android-developers.blogspot.com/2011/09/androids-http-clients.html –

+8

यह समाधान समस्या का समाधान क्यों करता है? –

+0

जल्द या बाद में, विशेष रूप से एंड्रॉइड एम बढ़ने के साथ, एचटीपी क्लाइंट प्रभावी रूप से बहिष्कृत हो रहा है। आगे लंबे जीवन वाले ऐप्स के लिए URLConnection की अनुशंसा की जाती है। उत्तर और स्पष्टीकरण के लिए – Josh

0

मुझे विश्वास है कि आपकी समस्या आपके कोड के क्रम में है। URLConnection JavaDocs में उन विधियों की जांच करें - mUrl.openConnection() पर कनेक्शन के बाद setRequestProperty को कॉल नहीं किया जाना चाहिए। यह पहली बार काम कर रहा है क्योंकि कनेक्शन बनाया गया है, तो आप उन सेटिंग्स को बदल रहे हैं जो अगली बार कनेक्शन बनाने का प्रयास करते समय कुछ भी प्रभावित नहीं कर रहे हैं। इसके बजाय HttpURLConnection कन्स्ट्रक्टर का उपयोग करने का प्रयास करें ताकि आप गुण सेट करने के बाद कनेक्ट() को कॉल कर सकें।

+1

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे डर है कि काम नहीं करेगा। यह एपीआई दस्तावेज़ कहता है: एक यूआरएल कनेक्शन केवल तात्कालिकता के बाद स्थापित किया जा सकता है लेकिन दूरस्थ संसाधन से कनेक्ट करने से पहले। मेरे मामले में वास्तविक संबंध में होता है:) conn.getInputStream (और उस हेडर सेटअप – ggomeze

28

कनेक्शन पूल HttpURLConnection द्वारा प्रयोग किया जाता है जब यह कनेक्शन को जीवित रखने के इस तरह टूट गया है कि यह कनेक्शन है कि सर्वर द्वारा बंद कर दिया गया है उपयोग करने के लिए कोशिश करता है। डिफ़ॉल्ट रूप से एंड्रॉइड सभी कनेक्शनों पर KeepAlive सेट करता है।

System.setProperty("http.keepAlive", "false"); एक ऐसा कामकाज है जो सभी कनेक्शन के लिए KeepAlive को अक्षम करता है, तो आप कनेक्शन पूल में बग से बचें।

conn.setRequestProperty("Connection","Keep-Alive"); इस विशेष कनेक्शन के लिए KeepAlive चालू करता है, अनिवार्य रूप से System.setProperty("http.keepAlive", "false"); करता है।

इसके अलावा मैं हमेशा स्पष्ट रूप से connect() पर कॉल करता हूं क्योंकि यह स्पष्ट करता है कि आप अपना कनेक्शन सेटअप कहां समाप्त कर रहे हैं। मुझे यकीन नहीं है कि इस विधि को कॉल करना वैकल्पिक है या नहीं।

System.setProperty("http.keepAlive", "false"); 
HttpURLConnection conn = (HttpURLConnection) mURL.openConnection(); 
conn.setUseCaches(false); 
conn.setRequestProperty("User-Agent", useragent); 
conn.setConnectTimeout(30000); 
conn.setDoOutput(true); 
conn.setDoInput(true); 
consumer.sign(conn); 

conn.connect(); 

InputSource is = new InputSource(conn.getInputStream()); 
+0

धन्यवाद @ फोनेटिक !! मैं अब परीक्षण नहीं कर सकता क्योंकि मैं HttpClient में स्थानांतरित हुआ, लेकिन मुझे यकीन है कि यह अन्य लोगों की मदद कर सकता है। एक बार फिर धन्यवाद! – ggomeze

+0

@ user464773 'System.setProperty (" http.keepAlive "," false "); 'ऐप के सभी कनेक्शन पर _Keep Alive_ अक्षम करता है। यही वह है जिसे हम चाहते हैं क्योंकि _किप एलीव_ हमेशा बग का कारण बनता है। 'Conn.setRequestProperty ("कनेक्शन", "बंद करें") का उपयोग करना;' केवल 'conn' के लिए _Keep Alive_ अक्षम करता है, जब हम किसी भी कनेक्शन में इसे जोड़ना भूल जाते हैं तो दरवाजा खोलने के लिए दरवाजा खोलता है। मुझे नहीं पता कि बग ने इसे सद्भावना में वापस कर दिया है लेकिन एंड्रॉइड टीम को इसके बारे में पता है: http://code.google.com/p/android/issues/detail?id=7786 – barrycburton

+0

धन्यवाद, यही वही है जो मैं करता हूं – TacoEater

23

आप System.setProperty("http.keepAlive", "false");

जरूरत है आपको बस conn.setRequestProperty("connection", "close");

इससे समस्या ठीक होती है, लेकिन प्रभावी ढंग से Alives रखने को मारता है और इसलिए संभावित (जो शर्मनाक है) एक से अधिक कनेक्शन धीमा हो जाता है है न। मैं सद्भावना बग ट्रैकर के माध्यम से देख रहा था लेकिन वास्तव में कुछ भी नहीं मिला।

@ फोनेटिक, क्या आप जानते हैं कि यह पहले से ही सद्भाव के साथ उठाया गया है या नहीं? मेरा मतलब यह नहीं है कि यह बहुत मदद करता है क्योंकि एक महीने से अधिक के बाद एक और http संबंधित लूनी दोष अभी भी असाइन नहीं किया गया है।

+0

conn.setRequestProperty ("कनेक्शन", "बंद करें"); मेरे लिए काम किया सरल और प्रभावी। मैं एंड्रॉइड एल और एम के लिए यूआरएल कनेक्शन के साथ काम कर रहा हूं। – Josh

1

यह बग एंड्रॉइड 2.3 संस्करण में तय किया गया था, क्योंकि हम जानते हैं कि System.setProperty("http.keepAlive", "false"); एक बहुत अच्छा समाधान नहीं है, क्योंकि मोबाइल डिवाइस पर, प्रत्येक कनेक्शन हर समय उच्च लागत बनाता है।

0

जब मैं https कनेक्शन खोलने की कोशिश कर रहा हूं तो यह ठीक काम कर रहा है लेकिन दूसरी बार यह विफल हो जाता है क्योंकि मैंने HttpsURLConnection कनेक्शन के बजाय सिस्टम प्रॉपर्टी वैल्यू सेट किया है। मुझे java.io.IOException मिला है: त्रुटि लिखें: https कनेक्शन दूसरी बार खोलते समय I/O समस्या। मैंने अपने आवेदन पत्र में निम्नलिखित कोड का उपयोग किया है।

System.setProperty("http.proxyHost", proxy); 
System.setProperty("http.proxyPort", port); 

लेकिन जब मैंने इसे नीचे बदल दिया तो यह ठीक काम करता है।

javax.net.ssl.HttpsURLConnection ucon = (javax.net.ssl.HttpsURLConnection) urlWPF.openConnection(proxyserver); 

ucon.setRequestProperty("http.proxyHost", proxy); 
ucon.setRequestProperty("http.proxyPort", port); 

यदि आप सिस्टम प्रॉपर्टी सेट करते हैं, तो यह पूरे एप्लिकेशन के लिए लागू होगा। यदि आप इसे रीसेट करना चाहते हैं, तो आप दो तरीकों का पालन कर सकते हैं। एक है आपको सर्वर रीफ्रेश लेना है और दूसरा आपको HttpsURLConnection.setRequestProperty को बदलना है, जहां ऊपर आवश्यक है ऊपर उल्लिखित है।

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