(八)、Java 網絡編程

所謂計算機網絡,就是把分佈在不同地理區域的計算機與專門的外部設備用通信線路互聯成一個規模大、功能強的網絡系統,從而使衆多的計算機可以方便地傳遞信心,共享資源。
計算機網絡通常按照規模大小可以劃分爲:局域網、城域網、廣域網
按照拓撲結構可以分爲:星型網絡、總線網絡、環形網絡、樹形網絡等

1、OSI七層模型

  • 應用層
  • 表示層
  • 會話層
  • 傳輸層
  • 網絡層
  • 數據鏈路層
  • 物理層

2、Java網絡支持

Java爲網絡提供了java.net包,該包下提供了以編程方式訪問Web服務的功能。

2.1、InetAddress

  • getByName(String host) 根據主機獲取響應的InteAddress對象
  • getByAddress(byte[] addr) 根據原始的IP地址獲取響應的InterAddress對象
  • String getHostAddress() 獲取IP地址字符串
  • String getHostName() 返回IP地址的主機名
public class App {

    public static void main(String[] args) throws UnknownHostException {

        //根據主機名獲取InetAddress實例
        InetAddress a = InetAddress.getByName("www.baidu.com");
        InetAddress local = InetAddress.getByAddress(new byte[]{127,0,0,1});
        System.out.println(local);
        //獲取實例的IP地址
        String ip = a.getHostAddress();
        System.out.println(ip);
    }
}

2.2、URLDecoder/URLEncoder

URLDecoder/URLEncoder完成普通字符串與 application/x-www-form-urlencoder MIME 字符串之間的轉換。

  • URLDecoder.decode(String s,String enc)
  • URLEncoder.encode(String s,String enc)
public class Coder {

    public static void main(String[] args) throws UnsupportedEncodingException {

        String decode = URLDecoder.decode("%D1%F4%B9%E2","GBK");
        System.out.println(decode);

        String encoder = URLEncoder.encode("網絡編程","GBK");
        System.out.println(encoder);

    }

}

輸出

2.3、URL/URLConnection

URL-統一資源定位符,它是指向互聯網的指針,URL可以有協議名,主機,端口和資源組成。
URL類提供了多個構造方法,獲取URL對象後,可以使用以下方法來獲取相應的資源:
1. String getFile() 獲取URL資源名
2. String getHost() 獲取URL的主機名
3. String getPath() 獲取URL的路徑部分
4. int getPort() 獲取URL的端口號
5. String getProtocol() 獲取URL的協議名稱
6. String getQuery() 獲取URL的查詢字符串部分
7. URLConnection openConnection() 返回一個URLConnection對象,與遠程資源相連接
8. InputStream openStream() 打開與此URL的連接,並返回輸入流


通常創建一個和URL的連接,併發送請求、讀取此URL引用的資源需要以下幾步:
1. 通過openConnection方法創建URLConnection對象
2. 設置URLConnection對象的參數和請求屬性
3. 如果只是發送GET請求,使用connect()方法建立和遠程資源之間的實際連接即可;若要使用POST方式進行請求,則需要獲取URLConnection實例對應的輸出流來發送請求數據

2.3.1、發送GET/POST請求並獲取返回

package com.xiaopeng.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class GET_POST_test {

    /**
     * 向指定的URL發送GET請求
     *
     * @param url   發送請求的URL
     * @param param 請求參數
     * @return result 請求的響應
     */
    private static String sendGet(String url, String param) {
        String result = "";
        String urlName = url + "?" + param;
        URLConnection conn = null;

        try {
            URL realUrl = new URL(urlName);
            conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1;SV1)");
            //建立實際連接
            conn.connect();
            Map<String, List<String>> resMap = conn.getHeaderFields();
            //遍歷所有的響應頭字段
            System.out.println("================輸出返回響應頭================");
            for (String key : resMap.keySet()) {
                System.out.println(key + " --> " + resMap.get(key));
            }
            System.out.println("================輸出返回響應體================");
            //讀取URL的響應
            BufferedReader br = new BufferedReader
                    (new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) {
                result += "\n" + line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 向指定的URL發送POST請求
     *
     * @param url   發送請求的URL
     * @param param 請求參數
     * @return 遠程資源的返回
     */
    private static String sendPost(String url, String param) {

        String resPost = "";
        URLConnection conn = null;
        try {
            URL realURL = new URL(url);
            conn = realURL.openConnection();
            //設置請求屬性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1;SV1)");

            //必須設置
            conn.setDoInput(true);
            conn.setDoOutput(true);

            PrintWriter out = new PrintWriter(conn.getOutputStream());
            //發送請求參數
            out.print(param);
            //flush輸出流刷新緩衝區
            out.flush();

            BufferedReader br = new BufferedReader
                    ((new InputStreamReader(conn.getInputStream(), "utf-8")));

            String line;
            while ((line = br.readLine()) != null) {

                resPost += "\n" + line;

            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return resPost;
    }


    public static void main(String[] args) {
        System.out.println("get方式請求");
        String getRes = GET_POST_test.sendGet
                ("http://blog.csdn.net/no_cainiao/article/details/79371768", null);
        System.out.println(getRes);

        System.out.println("post方式請求");
        String postRes = GET_POST_test.sendPost("https://go.java/index.html", "intcmp=gojava-banner-java-com");
        System.out.println(postRes);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章