HttpURLConnection bağlantı işlemini açıklayabilir misiniz?
HTTPURLConnection
bir web servisine bağlanmak için kullanıyorum. HTTPURLConnection
kullanmayı biliyorum ama nasıl çalıştığını anlamak istiyorum. Temel olarak, aşağıdaki bilmek istiyorum:
- Hangi noktada
HTTPURLConnection
verilen URL için bir bağlantı kurmaya çalışmak mı? - Hangi noktada başarılı bir şekilde bağlantı kurmak mümkün olduğunu öğrenebilir miyim?
- Bir bağlantı kurmak ve gerçek bir istek bir adım/yöntem çağrısı yapılan bir gönderme mi? Ne yöntemi?
- Rahip olmayan kimse görev
getOutputStream
getInputStream
işlevini açıklayabilir misiniz? Bağlanmaya çalıştığım server aşağı olduğunda,getOutputStream
Exception
bir ben fark ettim.HTTPURLConnection
sadece bengetOutputStream
çağırdığınızda bağlantı kurmak için başlayacak anlamına mı geliyor? NasılgetInputStream
? SadecegetInputStream
getOutputStream
herhangi bir istek henüz göndermedim ama sadece bir bağlantı kurar anlamına mı geliyor? yanıt almak mümkün olduğum içinHttpURLConnection
getInputStream
çağırmak istemek için sunucuya geri tepki için gidiyoruz? openConnection
sadece yeni bir bağlantı nesnesi oluşturur ama herhangi bir bağlantı henüz kurulamadı söylemek doğru olur mu?- Nasıl okumak yükü ölçmek ve havai bağlayabilir miyim?
CEVAP
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) {
// ...
}
Sorularınıza ilk 3 cevaplar örnek HTTP yukarıda YAZILAN her yöntemi yanında satır içi yorum olarak listelenmiş.
Döner bu bağlantı için yazan bir çıkış akışı.
Temel olarak, bu nasıl çalıştığını iyi bir anlayışa sahip olduğunuzu düşünüyorum. bana uzun lafın kısası sadece tekrar edeyim. getOutputStream
temel olarak açılırgetOutputStream
, seni görmek ne zaman açıyorsunwriter.write("message=" message);
diyene kadar aslında hiçbir veri yazmayın.
Döner bu açık bağlantı okur bir giriş akışı. Bir SocketTimeoutException veri okumak için kullanılabilir olmadan önce okumak zaman aşımı süresi dolduktan sonra iade giriş akışı okunurken atılabilir.
getInputStream
tersini yapar. getOutputStream
gibi, o da açarSocketTimeoutException
bir görürsünüz.
Nasıl getİnputStream? Sadece getİnputStream yanıt almak mümkün ben olduğuma göre, o zaman getOutputStream herhangi bir istek henüz göndermedim ama sadece bir bağlantı kurar anlamına mı geliyor?
Bir istek gönderme ve veri gönderen iki farklı işlem olduğunu unutmayın. Ne zaman seni çağırırurl.openConnection()
, sunucuya bir istek bağlantı kurmak için gönderin. Sunucu bağlantı olduğunu size bir bildirim gönderir oluşan bir sıkışma var. Ya veri göndermek ve almak için hazır olduğunu, daha sonra zaman içinde bu noktada. Böylece, getOutputStream aramak gerekmez
Herkesin anlayacağı, yapma getInputStream
istek bu ifade ile bir telefon görüşmesi için arkadaşının evine Selam, sakıncası yoksa ben gelip ödünç bu çifti Yardımcısı kulpları?" ve arkadaşın kurar elini sıkarak söyleyerek, "Emin! Gel ve al". O zaman, bu noktada, bağlantı, arkadaşının evine yürüyüp, kapıyı çalacak ve yardımcısı kulpları istek ve evine yürüyüş yaptı.
getOutputStream
benzer bir arkadaşını arayıp, şunu söylemek içerecektir, param var Hey "sana borçluyum, sana gönderebilir miyim? Arkadaşın, uzun zamandır sakladın o kadar paraya vermeye gerek diyor, "Tabii, gel". daha piç Seni arkadaşının evine dalıp "" ona parayı. SONRASI çok O zaman sen kurtuluyor ve evine gidersin.
Şimdi, herkesin anlayacağı bir örnek ile devam eden, bazı İstisnalar bakalım. Arkadaşın seni aradı ve o evde olmasa, o 500 bir hata olabilir. Eğer arkadaşın seni yorgun her zaman para Borçlanma ve bağlantısız bir dizi mesaj ararsan var, 404 sayfa bulunamadı. Eğer telefon faturası ödemediğini çünkü ölü ise, o bir IOException olabilir. (NOT: Bu bölüm 100% doğru olmayabilir. Sen sokak ağzıyla neler olduğu hakkında genel bir fikir vermek amacıyla.)
Soru #5:
openConnection
yeni bir bağlantı nesnesi oluşturur. URL.openConnection javadocs:
Yeni bir bağlantı her zaman bu URL için protokol işleyicisi openConnection yöntemi çağırarak açtı.
Bağlantı openConnection aradığınızda kurulur ve İnputStream, OutputStream, ya da her ikisi de, onları örneğini denir.
Soru #6:
Yükü ölçmek için, ben genellikle tüm bağlantı etrafta çok basit bazı zamanlama kodu gibi sarın:
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) );
İsteği zaman ve yükü ölçmek için daha gelişmiş yöntemler vardır eminim, ama bu genellikle benim ihtiyaçları için yeterli.
Sormadın ki kapanış bağlantıları hakkında daha fazla bilgi için, In Java when does a URL connection close? bkz.
Akarsu kavramını açıklayabilir misiniz...
Kilitler Python ile ilgili olarak açık...
STA ve MTA açıklayabilir misiniz?...
Biri bana bir dizinin boyutunu veren b...
Biri bana bu SQL enjeksiyon saldırısı ...