String message = URLEncoder.encode("my message", "UTF-8");
try {
// instantiate the URL object with the target URL of the resource to
// request
URL url = new URL("http://www.example.com/comment");
// instantiate the HttpURLConnection with the URL object - A new
// connection is opened every time by calling the openConnection
// method of the protocol handler for this URL.
// 1. This is the point where the connection is opened.
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
// set connection output to true
connection.setDoOutput(true);
// instead of a GET, we're going to send using method="POST"
connection.setRequestMethod("POST");
// instantiate OutputStreamWriter using the output stream, returned
// from getOutputStream, that writes to this connection.
// 2. This is the point where you'll know if the connection was
// successfully established. If an I/O error occurs while creating
// the output stream, you'll see an IOException.
OutputStreamWriter writer = new OutputStreamWriter(
connection.getOutputStream());
// write data to the connection. This is data that you are sending
// to the server
// 3. No. Sending the data is conducted here. We established the
// connection with getOutputStream
writer.write("message=" + message);
// Closes this output stream and releases any system resources
// associated with this stream. At this point, we've sent all the
// data. Only the outputStream is closed at this point, not the
// actual connection
writer.close();
// if there is a response code AND that response code is 200 OK, do
// stuff in the first if block
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// OK
// otherwise, if any other status code is returned, or no status
// code is returned, do stuff in the else block
} else {
// Server returned HTTP error code.
}
} catch (MalformedURLException e) {
// ...
} catch (IOException e) {
// ...
}
आपके सवालों के पहले 3 उत्तर प्रत्येक विधि के साथ इनलाइन टिप्पणियों के रूप में सूचीबद्ध हैं, उदाहरण के लिए ऊपर HTTP POST में।
से getOutputStream :
एक आउटपुट स्ट्रीम देता है जो इस कनेक्शन को लिखता है।
मूल रूप से, मुझे लगता है कि आपके पास यह समझने की अच्छी समझ है कि यह कैसे काम करता है, इसलिए मुझे आम आदमी की शर्तों को दोहराना चाहिए। सर्वर से डेटा लिखने के इरादे से getOutputStream
मूल रूप से एक कनेक्शन स्ट्रीम खोलता है । उपरोक्त कोड उदाहरण में "संदेश" एक टिप्पणी हो सकती है जो हम सर्वर पर भेज रहे हैं जो एक पोस्ट पर छोड़ी गई टिप्पणी का प्रतिनिधित्व करता है। जब आप देखते हैं getOutputStream
, तो आप लेखन के लिए कनेक्शन स्ट्रीम खोल रहे हैं , लेकिन जब तक आप कॉल नहीं करते तब तक आप वास्तव में कोई डेटा नहीं लिखते हैं writer.write("message=" + message);
।
से getInputStream () :
एक इनपुट स्ट्रीम देता है जो इस खुले कनेक्शन से पढ़ता है। यदि पढ़ने के लिए डेटा उपलब्ध होने से पहले रीड टाइमआउट की समय सीमा समाप्त हो जाती है, तो रिटर्न इनपुट स्ट्रीम से पढ़ते समय एक सॉकेट टाइमआउट अपवाद को फेंका जा सकता है।
getInputStream
इसके विपरीत करता है। जैसे getOutputStream
, यह एक कनेक्शन स्ट्रीम भी खोलता है , लेकिन इरादा सर्वर से डेटा पढ़ने का है, इसे लिखने का नहीं। यदि कनेक्शन या स्ट्रीम-ओपनिंग विफल हो जाती है, तो आप देखेंगे SocketTimeoutException
।
कैसे GetInputStream के बारे में? चूंकि मैं केवल getInputStream पर प्रतिक्रिया प्राप्त करने में सक्षम हूं, तो इसका मतलब यह है कि मैंने अभी तक getOutputStream पर कोई अनुरोध नहीं भेजा है, लेकिन बस एक कनेक्शन स्थापित करता है?
ध्यान रखें कि अनुरोध भेजना और डेटा भेजना दो अलग-अलग ऑपरेशन हैं। जब आप getOutputStream या getInputStream आह्वान करते हैं url.openConnection()
, तो आप कनेक्शन स्थापित करने के लिए सर्वर को अनुरोध भेजते हैं। एक हैंडशेक है जो तब होता है जब सर्वर आपको एक पावती भेजता है कि कनेक्शन स्थापित है। यह उस समय है जब आप डेटा भेजने या प्राप्त करने के लिए तैयार हैं। इस प्रकार, आपको एक कनेक्शन खोलने के लिए getOutputStream को कॉल करने की आवश्यकता नहीं है , जब तक कि डेटा बनाने के लिए अनुरोध करने का आपका उद्देश्य नहीं है।
आम आदमी की शर्तों में, एक getInputStream
अनुरोध करना आपके दोस्त के घर पर फोन कॉल करने के बराबर है, "अरे, क्या यह ठीक है अगर मैं आता हूं और उस जोड़ी को कुलपतियों के रूप में उधार लेता हूं?" और आपका दोस्त यह कहकर हैंडशेक स्थापित करता है, "निश्चित! आओ और प्राप्त करो"। फिर, उस बिंदु पर, कनेक्शन बनाया जाता है, आप अपने दोस्त के घर पर चलते हैं, दरवाजे पर दस्तक देते हैं, वाइस ग्रिप का अनुरोध करते हैं, और अपने घर वापस चले जाते हैं।
इसी तरह के उदाहरण के लिए getOutputStream
अपने दोस्त को फोन करना और यह कहना कि "अरे, मेरे पास वह पैसा है जो मैं तुम्हें देना चाहता हूं, क्या मैं तुम्हें भेज सकता हूं"? आपके दोस्त को पैसे और बीमार की ज़रूरत है, जिसे आपने इसे लंबे समय तक रखा था, कहते हैं, "निश्चित रूप से, आप सस्ते कमीने पर आते हैं"। तो आप अपने दोस्त के घर चलें और उसके लिए "POST" करें। वह फिर आपको बाहर निकालता है और आप अपने घर वापस जाते हैं।
अब, आम आदमी के उदाहरण के साथ जारी, आइए कुछ अपवादों को देखें। यदि आपने अपने दोस्त को फोन किया और वह घर नहीं था, तो वह 500 त्रुटि हो सकती है। यदि आपने कॉल किया और डिस्कनेक्ट किया हुआ नंबर संदेश मिला क्योंकि आपका मित्र हर समय आपसे पैसे उधार लेता है, तो वह 404 पृष्ठ नहीं मिला। यदि आपका फोन मर चुका है क्योंकि आपने बिल का भुगतान नहीं किया है, तो वह IOException हो सकता है। (नोट: यह खंड १००% सही नहीं हो सकता है। इसका उद्देश्य आपको सामान्य विचार देना है कि आम आदमी की शर्तों में क्या हो रहा है।)
प्रश्न # 5:
हां, आप सही हैं कि ओपनकॉन्नेक्शन केवल एक नया कनेक्शन ऑब्जेक्ट बनाता है, लेकिन इसे स्थापित नहीं करता है। कनेक्शन स्थापित होता है जब आप या तो getInputStream या getOutputStream कहते हैं।
openConnection
एक नया कनेक्शन ऑब्जेक्ट बनाता है। से URL.openConnection javadocs :
इस URL के लिए प्रोटोकॉल हैंडलर की ओपनकॉन्च विधि को कॉल करके हर बार एक नया कनेक्शन खोला जाता है।
कनेक्शन की स्थापना तब की जाती है जब आप ओपनकॉइन कहते हैं, और इनपुटस्ट्रीम, आउटपुटस्ट्रीम, या दोनों, को बुलाया जाता है जब आप उन्हें इंस्टेंट करते हैं।
प्रश्न # 6 :
ओवरहेड को मापने के लिए, मैं आम तौर पर पूरे कनेक्शन ब्लॉक के आसपास कुछ बहुत ही सरल टाइमिंग कोड लपेटता हूं, जैसे:
long start = System.currentTimeMillis();
log.info("Time so far = " + new Long(System.currentTimeMillis() - start) );
// run the above example code here
log.info("Total time to send/receive data = " + new Long(System.currentTimeMillis() - start) );
मुझे यकीन है कि अनुरोध समय और ओवरहेड को मापने के लिए अधिक उन्नत तरीके हैं, लेकिन यह आम तौर पर मेरी जरूरतों के लिए पर्याप्त है।
कनेक्शन बंद करने के बारे में जानकारी के लिए, जिसके बारे में आपने नहीं पूछा, जावा में देखें कि URL कनेक्शन कब बंद होता है? ।