java網路編程四:InetAddress類、URL類、URLConnection類解析及用法樣本

來源:互聯網
上載者:User

1、InetAddress類實現簡單IP掃描獲得主機名稱

package demo.net;import java.net.InetAddress;import java.net.UnknownHostException;/* * 擷取指定IP的主機名稱 */public class IPScanner {// 傳入IP地址,返回主機名稱,若主機不可達則返回ip地址的字串形式public static String scanner(byte[] ip) {InetAddress addr = null;try {addr = InetAddress.getByAddress(ip);} catch (UnknownHostException e) {e.printStackTrace();}return addr.getHostName();}public static void main(String[] args) {String hostName;String ip;for (int i = 0; i <= 127; i++) {ip = "59.68.255." + i;hostName = scanner(new byte[] { 59, 68, (byte) 255, (byte)i });if (!ip.equals(hostName))System.out.println(ip +" : "+hostName);}}}

 

2、URL樣本

package demo.net;import java.io.IOException;import java.net.URL;import java.util.Scanner;/* * URL類用法樣本,URL是統一資源定位器,可以開啟到達一個資源的流,從而擷取資源的內容 * 樣本中擷取武漢工業學院首頁的內容,返回的內容是html文本 */public class URLDemo {public static void main(String[] args) {try {URL url = new URL("http://www.whpu.edu.cn");Scanner in = new Scanner(url.openStream());while (in.hasNextLine())System.out.println(in.nextLine());} catch (IOException e) {e.printStackTrace();}}}

運行結果:輸出html頁面源碼

 

3、URLConnection類樣本

package demo.net;import java.io.IOException;import java.net.URL;import java.net.URLConnection;import java.util.Scanner;/* * URLConnection類是一個抽象類別,定位到資源後可以讀取資源內容且獲得頭資訊 * 同時也可以用來提交表單資料,此樣本展示擷取資源及頭資訊 */public class URLConnectionDemo {public static void main(String[] args) {try {// 1、通過在 URL 上調用 openConnection 方法建立連線物件。URL url = new URL("http://www.whpu.edu.cn");URLConnection connection = url.openConnection();// 2、處理設定參數和一般請求屬性。connection.setDoInput(true);connection.setDoOutput(true);// 3、使用 connect 方法建立到遠程對象的實際串連。connection.connect();// 4、遠程對象變為可用。遠程對象的頭欄位和內容變為可訪問。System.out.println(connection.getContentType());System.out.println(connection.getContentEncoding());System.out.println(connection.getContentLength());System.out.println(connection.getDate());// 讀取內容Scanner in = new Scanner(connection.getInputStream());while (in.hasNextLine())System.out.println(in.nextLine());} catch (IOException e) {e.printStackTrace();}}}

運行結果:輸出一些前序資訊及html頁面源碼

4、總結

總結:a:) HttpURLConnection的connect()函數,實際上只是建立了一個與伺服器的tcp串連,並沒有實際發送http請求。
    無論是post還是get,http請求實際上直到HttpURLConnection的getInputStream()這個函數裡面才正式發送出去。
       b:) 在用POST方式發送URL請求時,URL請求參數的設定順序是重中之重,
    對connection對象的一切配置(那一堆set函數)
    都必須要在connect()函數執行之前完成。而對outputStream的寫操作,又必須要在inputStream的讀操作之前。
    這些順序實際上是由http請求的格式決定的。
    如果inputStream讀操作在outputStream的寫操作之前,會拋出例外:
    java.net.ProtocolException: Cannot write output after reading input.......
      
       c:) http請求實際上由兩部分組成,
    一個是http頭,所有關於此次http請求的配置都在http頭裡面定義,
           一個是本文content。
    connect()函數會根據HttpURLConnection對象的配置值產生http頭部資訊,因此在調用connect函數之前,
    就必須把所有的配置準備好。
       d:) 在http頭後面緊跟著的是http請求的本文,本文的內容是通過outputStream流寫入的,
    實際上outputStream不是一個網路流,充其量是個字串流,往裡面寫入的東西不會立即發送到網路,
    而是存在於記憶體緩衝區中,待outputStream流關閉時,根據輸入的內容產生http本文。
    至此,http請求的東西已經全部準備就緒。在getInputStream()函數調用的時候,就會把準備好的http請求
    正式發送到伺服器了,然後返回一個輸入資料流,用於讀取伺服器對於此次http請求的返回資訊。由於http
    請求在getInputStream的時候已經發送出去了(包括http頭和本文),因此在getInputStream()函數
    之後對connection對象進行設定(對http頭的資訊進行修改)或者寫入outputStream(對本文進行修改)
    都是沒有意義的了,執行這些操作會導致異常的發生。

     更詳細的URLConnection類解析內容請參考:http://www.blogjava.net/supercrsky/articles/247449.html

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.