Java學習筆記——網絡編程、反射

十四、網絡編程

1.網絡編程三要素

ip、端口號、協議

2.tcp和udp

UDP

面向無連接,數據不安全,速度快。不區分客戶端與服務端。

TCP

面向連接(三次握手),數據安全,速度略低。分爲客戶端和服務端。
三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸數據

3.Socket概述

網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信。
數據在兩個Socket間通過IO流傳輸。
Socket在應用程序中創建,通過一種綁定機制與驅動程序建立關係,告訴自己所對應的IP和port。

4.udp編程

流程

發送Send

  • 創建DatagramSocket, 隨機端口號
  • 創建DatagramPacket, 指定數據, 長度, 地址, 端口
  • 使用DatagramSocket發送DatagramPacket
  • 關閉DatagramSocket

    DatagramSocket socket = new DatagramSocket();       //創建socket相當於創建碼頭
    Scanner sc = new Scanner(System.in);    
    while(true) {
        String str = sc.nextLine();
        if("quit".equals(str))
            break;
        DatagramPacket packet =     //創建packet相當於創建集裝箱
                new DatagramPacket(str.getBytes(), str.getBytes().length, 
                InetAddress.getByName("127.0.0.1"), 6666);
        socket.send(packet);            //發貨
    }
    socket.close();
    

接收Receive

  • 創建DatagramSocket, 指定端口號
  • 創建DatagramPacket, 指定數組, 長度
  • 使用DatagramSocket接收DatagramPacket
  • 關閉DatagramSocket
  • 從DatagramPacket中獲取數據

    DatagramSocket socket = new DatagramSocket(6666);                       
    //創建socket相當於創建碼頭
    DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);       
    //創建packet相當於創建集裝箱
    while(true) {
        socket.receive(packet);                                             
        //接收貨物
        byte[] arr = packet.getData();
        int len = packet.getLength();
        String ip = packet.getAddress().getHostAddress();
        System.out.println(ip + ":" + new String(arr,0,len));
    }
    

接收方獲取ip和端口號

String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();

5.TCP協議

客戶端

創建Socket連接服務端(指定ip地址,端口號)通過ip地址找對應的服務器
調用Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
輸入流可以讀取服務端輸出流寫出的數據
輸出流可以寫出數據到服務端的輸入流

Socket socket = new Socket("127.0.0.1", 9999);      
//創建Socket指定ip地址和端口號
InputStream is = socket.getInputStream();           //獲取輸入流
OutputStream os = socket.getOutputStream();         //獲取輸出流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(os);   
System.out.println(br.readLine());//從服務器讀入
ps.println("");//輸出到服務器
socket.close();

服務端

創建ServerSocket(需要指定端口號)
調用ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
調用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流
輸入流可以讀取客戶端輸出流寫出的數據
輸出流可以寫出數據到客戶端的輸入流

ServerSocket server = new ServerSocket(9999);   //創建服務器
Socket socket = server.accept();                //接受客戶端的請求
InputStream is = socket.getInputStream();       //獲取輸入流
OutputStream os = socket.getOutputStream();     //獲取輸出流

BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintStream ps = new PrintStream(os);

ps.println("");//輸出到客戶端
System.out.println(br.readLine());//從客戶端讀取數據
server.close();
socket.close();

服務器的多線程實現

ServerSocket server = new ServerSocket(9999);   //創建服務器
    while(true) {
        final Socket socket = server.accept();              //接受客戶端的請求
        new Thread() {
            public void run() {
                try {
                    InputStreamReader(socket.getInputStream()));
                    PrintStream ps = new 
                    PrintStream(socket.getOutputStream());
                    ps.println("hello");
                    System.out.println(br.readLine());
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

十五、反射

1.類加載概述

當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載,連接,初始化三步來實現對這個類進行初始化。

加載

就是指將class文件讀入內存,併爲之創建一個Class對象。任何類被使用時系統都會建立一個Class對象。

連接

驗證 是否有正確的內部結構,並和其他類協調一致
準備 負責爲類的靜態成員分配內存,並設置默認初始化值
解析 將類的二進制數據中的符號引用替換爲直接引用

初始化

2.加載時機

創建類的實例
訪問類的靜態變量,或者爲靜態變量賦值
調用類的靜態方法
使用反射方式來強制創建某個類或接口對應的java.lang.Class對象
初始化某個類的子類
直接使用java.exe命令來運行某個主類

3.類加載器

負責將.class文件加載到內存中,併爲之生成對應的Class對象。

分類

Bootstrap ClassLoader 根類加載器
Extension ClassLoader 擴展類加載器
Sysetm ClassLoader 系統類加載器

作用

Bootstrap ClassLoader 根類加載器

也被稱爲引導類加載器,負責Java核心類的加載
比如System,String等。在JDK中JRE的lib目錄下rt.jar文件中

Extension ClassLoader 擴展類加載器

負責JRE的擴展目錄中jar包的加載。
在JDK中JRE的lib目錄下ext目錄

Sysetm ClassLoader 系統類加載器

負責在JVM啓動時加載來自java命令的class文件,以及classpath環境變量所指定的jar包和類路徑

4.反射概述

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意一個方法和屬性;
這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的字節碼文件對象。
而解剖使用的就是Class類中的方法,所以先要獲取到每一個字節碼文件對應的Class類型的對象。

5.獲取Class對象的三種辦法

Object類的getClass()方法,判斷兩個對象是否是同一個字節碼文件
靜態屬性class,鎖對象
Class類中靜態方法forName(),讀取配置文件

Class<?> clazz = Class.forName(br.readLine());

6.常用方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章