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