SORU
12 NİSAN 2012, PERŞEMBE


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 ben getOutputStream çağırdığınızda bağlantı kurmak için başlayacak anlamına mı geliyor? Nasıl getInputStream? Sadece getInputStream 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çin HttpURLConnection 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
12 NİSAN 2012, PERŞEMBE


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ş.

getOutputStream:

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ırbağlantısunucuya veri yazma niyetiyle akışı. "Mesaj" bir yorum bir yazı üzerine sol temsil eden sunucuya gönderiyoruz bir yorum olabilir. yukarıdaki kod örneğinde getOutputStream, seni görmek ne zaman açıyorsunbağlantıyazmak için stream, ama writer.write("message=" message); diyene kadar aslında hiçbir veri yazmayın.

getInputStream():

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çarbağlantıizle, ama niyet sunucudan veri okumak, yazmak değil. Eğer bağlantı veya akışı-açılış başarısız olursa, SocketTimeoutException 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ırgetOutputStream veya getİnputStreamurl.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 gerekmezbir bağlantı kurmakistek yapmak için Amacınız veri göndermek sürece akışı açın.

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:

Evet, openConnection sadece yeni bir bağlantı nesnesi oluşturur ama bunu kurmak değil, bu doğru. Bağlantı ya getİnputStream veya getOutputStream aradığınızda kurulur.

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B3ASTTY™

    B3ASTTY™

    27 Mayıs 2013
  • eurotuner

    eurotuner

    6 Mart 2006
  • The Verge

    The Verge

    8 AĞUSTOS 2006