1. 程式人生 > >java基礎重點講解,看了還不會找我(二十六)

java基礎重點講解,看了還不會找我(二十六)

day26授課目錄:

###26.01_網路程式設計(網路程式設計概述)(瞭解)
* A:計算機網路
    * 是指將地理位置不同的具有獨立功能的多臺計算機及其外部裝置,通過通訊線路連線起來,在網路作業系統,網路管理軟體及網路通訊協議的管理和協調下,實現資源共享和資訊傳遞的計算機系統。
* B:網路程式設計
    * 就是用來實現網路互連的不同計算機上執行的程式間可以進行資料交換。


###26.02_網路程式設計(網路程式設計三要素之IP概述)(掌握)
* 每個裝置在網路中的唯一標識
* 每臺網絡終端在網路中都有一個獨立的地址,我們在網路中傳輸資料就是使用這個地址。 
* ipconfig:檢視本機IP192.168.12.42
* ping:測試連線192.168.40.62
* 本地迴路地址:127.0.0.1 255.255.255.255是廣播地址
* IPv4:4個位元組組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已經用盡。 
* IPv6:8組,每組4個16進位制數。
* 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
* 1a2b::aaaa:0000:0000:0000:aabb:1f2f
* 1a2b:0000:aaaa::aabb:1f2f
* 1a2b:0000:aaaa::0000:aabb:1f2f
* 1a2b:0000:aaaa:0000::aabb:1f2f

###26.03_網路程式設計(網路程式設計三要素之埠號概述)(掌握)
* 每個程式在裝置上的唯一標識
* 每個網路程式都需要繫結一個埠號,傳輸資料的時候除了確定發到哪臺機器上,還要明確發到哪個程式。
* 埠號範圍從0-65535
* 編寫網路應用就需要繫結一個埠號,儘量使用1024以上的,1024以下的基本上都被系統程式佔用了。
* 常用埠
    * mysql: 3306
    * oracle: 1521
    * web: 80
    * tomcat: 8080
    * QQ: 4000
    * feiQ: 2425

###26.04_網路程式設計(網路程式設計三要素協議)(掌握)
* 為計算機網路中進行資料交換而建立的規則、標準或約定的集合。
* UDP
    * 面向無連線,資料不安全,速度快。不區分客戶端與服務端。
* TCP
  * 面向連線(三次握手),資料安全,速度略低。分為客戶端和服務端。
    * 三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸資料


###26.05_網路程式設計(Socket通訊原理圖解)(瞭解)
* A:Socket套接字概述:
    * 網路上具有唯一標識的IP地址和埠號組合在一起才能構成唯一能識別的識別符號套接字。
    * 通訊的兩端都有Socket。
    * 網路通訊其實就是Socket間的通訊。
    * 資料在兩個Socket間通過IO流傳輸。
    * Socket在應用程式中建立,通過一種繫結機制與驅動程式建立關係,告訴自己所對應的IP和port。

###26.06_網路程式設計(UDP傳輸)(瞭解)
* 1.傳送Send
    * 建立DatagramSocket, 隨機埠號
    * 建立DatagramPacket, 指定資料, 長度, 地址, 埠
    * 使用DatagramSocket傳送DatagramPacket
    * 關閉DatagramSocket
* 2.接收Receive
    * 建立DatagramSocket, 指定埠號
    * 建立DatagramPacket, 指定陣列, 長度
    * 使用DatagramSocket接收DatagramPacket
    * 關閉DatagramSocket
    * 從DatagramPacket中獲取資料
* 3.接收方獲取ip和埠號
    * String ip = packet.getAddress().getHostAddress();
    * int port = packet.getPort();

###26.07_網路程式設計(UDP傳輸優化)
* 接收端Receive

        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));
        }
* 傳送端Send

        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();
###26.08_網路程式設計(UDP傳輸多執行緒)
* A傳送和接收在一個視窗完成

        public class Demo3_MoreThread {

            /**
             * @param args
             */
            public static void main(String[] args) {
                new Receive().start();
                
                new Send().start();
            }
        
        }

        class Receive extends Thread {
            public void run() {
                try {
                    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));
                    }
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }
        }

        class Send extends Thread {
            public void run() {
                try {
                    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();
                }  catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }
        }


###26.09_網路程式設計(UDP聊天圖形化介面)
    

###26.10_網路程式設計(UDP聊天傳送功能)
    
        
###26.11_網路程式設計(UDP聊天記錄功能)
    
    
###26.12_網路程式設計(UDP聊天清屏功能)


###26.13_網路程式設計(UDP聊天震動功能)


###26.14_網路程式設計(UDP聊天快捷鍵和程式碼優化)
    

###26.15_網路程式設計(UDP聊天生成jar檔案)

###26.16_網路程式設計(TCP協議)(掌握)
* 1.客戶端
    * 建立Socket連線服務端(指定ip地址,埠號)通過ip地址找對應的伺服器
    * 呼叫Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
    * 輸入流可以讀取服務端輸出流寫出的資料
    * 輸出流可以寫出資料到服務端的輸入流
* 2.服務端
    * 建立ServerSocket(需要指定埠號)
    * 呼叫ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
    * 呼叫Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流
    * 輸入流可以讀取客戶端輸出流寫出的資料
    * 輸出流可以寫出資料到客戶端的輸入流

###26.17_網路程式設計(TCP協議程式碼優化)
* 客戶端

        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("我想報名就業班");
        System.out.println(br.readLine());
        ps.println("爺不學了");
        socket.close();
* 服務端

        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());
        ps.println("報滿了,請報下一期吧");
        System.out.println(br.readLine());
        server.close();
        socket.close();

###26.18_網路程式設計(服務端是多執行緒的)(掌握)
    ServerSocket server = new ServerSocket(9999);    //建立伺服器
        while(true) {
            final Socket socket = server.accept();                //接受客戶端的請求
            new Thread() {
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        ps.println("歡迎諮詢傳智播客");
                        System.out.println(br.readLine());
                        ps.println("報滿了,請報下一期吧");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }

###26.19_網路程式設計(練習)
* 客戶端向伺服器寫字串(鍵盤錄入),伺服器(多執行緒)將字串反轉後寫回,客戶端再次讀取到是反轉後的字串
###26.20_網路程式設計(練習)
* 客戶端向伺服器上傳檔案
###26.21_day26總結
* 把今天的知識點總結一遍。