1. 程式人生 > >網路程式設計(UDP/TCP)+JAVA學習筆記-DAY26

網路程式設計(UDP/TCP)+JAVA學習筆記-DAY26

26.01_網路程式設計(網路程式設計概述)(瞭解)

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

26.02_網路程式設計(網路參考模型)

網路參考模型

網路模型7層概述:

  1. 物理層:主要定義物理裝置標準,如網線的介面型別、光纖的介面型別、各種傳輸介質的傳輸速率等。它的主要作用是傳輸位元流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地後在轉化為1、0,也就是我們常說的數模轉換與模數轉換)。這一層的資料叫做位元 。
  2. 資料鏈路層:主要將從物理層接收的資料進行MAC地址(網絡卡的地址)的封裝與解封裝。常把這一層的資料叫做。在這一層工作的裝置是交換機,資料通過交換機來傳輸。
  3. 網路層:主要將從下層接收到的資料進行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的裝置是路由器,常把這一層的資料叫做資料包
  4. 傳輸層:定義了一些傳輸資料的協議和埠號(WWW埠80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,資料量大的資料),UDP(使用者資料報協議,與TCP特性恰恰相反,用於傳輸可靠性要求不高,資料量小的資料,如QQ聊天資料就是通過這種方式傳輸的)。 主要是將從下層接收的資料進行分段和傳輸,到達目的地址後再進行重組。常常把這一層資料叫做段。
  5. 會話層:通過傳輸層(埠號:傳輸埠與接收埠)建立資料傳輸的通路。主要在你的系統之間發起會話或者接受會話請求(裝置之間需要互相認識可以是IP也可以是MAC或者是主機名)
  6. 表示層:主要是進行對接收的資料進行解釋、加密與解密、壓縮與解壓縮等(也就是把計算機能夠識別的東西轉換成人能夠能識別的東西(如圖片、聲音等)。
  7. 應用層: 主要是一些終端的應用,比如說FTP(各種檔案下載),WEB(IE瀏覽),QQ之類的(可以把它理解成我們在電腦螢幕上可以看到的東西.就是終端應用)。

26.03_網路程式設計三要素(掌握)

1. IP地址

  • 每個裝置網路中的唯一標識
    IP地址的組成

網路號+主機號

IP地址的分類


A類   0.0.0.0 ~ 127.255.255.255     0xxx xxxx
B類   128.0.0.0 ~ 191.255.255.255   10xx xxxx
C類   192.0.0.0 ~ 233.255.255.255   110x xxxx
D類   224.0.0.0 ~ 239.255.255.255   1110 xxxx
E類   240.0.0.0 ~ 247.255.255.255   1110 xxxx

  • 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
    dos命令

ipconfig :檢視本機IP  169.254.220.1
ping:測試連線www.baidu.com
本地迴路地址:127.0.0.1
廣播地址:255.255.255.255

InetAddress類


獲取任意主機:getByName        
主機名:getHostName
主機Ip地址:getHostAddress

2. 埠

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

3. 協議

  • 為計算機網路中進行資料交換而建立的規則、標準或約定的集合。
  • UDP
    • 面向無連線,資料不安全,速度快。不區分客戶端與服務端。(發簡訊)
    • 將資料封包傳輸,資料包最大64k。
    • 舉例:
      聊天留言,線上視訊,視訊會議,發簡訊,郵局包裹。
  • TCP
      * 面向連線(三次握手),資料安全,速度略低。分為客戶端和服務端。  
    • 三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸資料
    • 舉例:
      下載,打電話,QQ聊天(你線上嗎,線上,就回應下,就開始聊天了)

26.04_網路程式設計(Socket通訊原理圖解)(瞭解)

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

26.05_網路程式設計(UDP傳輸)(瞭解)

udp傳輸


DatagramSocket與DatagramPacket  
建立傳送端,接收端。  
建立資料包。
呼叫Socket的傳送接收方法。
關閉Socket。
傳送端與接收端是兩個獨立的執行程式。
  • 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.06_網路程式設計(UDP傳輸優化)

  • 接收端Receive
  • DatagramSocket socket = new DatagramSocket(6666);                       //建立socket相當於建立碼頭,定義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();
        int port = packet.getPort();
        System.out.println(ip + ":" + new String(arr,0,len));
    }
    
  • 傳送端Send

    DatagramSocket socket = new DatagramSocket();       //建立socket相當於建立碼頭,建立UDP服務,傳送端並沒有指定埠,會自動分配一個埠
    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);            //發貨,通過udp的socket服務中的功能完成資料包的傳送
    }
    socket.close();
    

26.07_網路程式設計(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.08_網路程式設計(UDP聊天圖形化介面)

26.09_網路程式設計(UDP聊天傳送功能)

26.10_網路程式設計(UDP聊天記錄功能)

26.11_網路程式設計(UDP聊天清屏功能)

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

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

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





26.15_網路程式設計(TCP協議)(掌握)

  • TCP傳輸
    • Socket和ServerSocket
    • 建立客戶端和伺服器端
    • 建立連線後,通過Socket中的IO流進行資料的傳輸
    • 關閉socket
    • 同樣,客戶端與伺服器端是兩個獨立的應用程式。
  • 1.客戶端
    • 建立Socket連線服務端(指定ip地址,埠號)通過ip地址找對應的伺服器
    • 呼叫Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
    • 輸入流可以讀取服務端輸出流寫出的資料
    • 輸出流可以寫出資料到服務端的輸入流
  • 2.服務端
    • 建立ServerSocket(需要指定埠號)
    • 呼叫ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
    • 呼叫Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流
    • 輸入流可以讀取客戶端輸出流寫出的資料
    • 輸出流可以寫出資料到客戶端的輸入流

26.16_網路程式設計(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.17_網路程式設計(服務端是多執行緒的)(掌握)

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.18_網路程式設計(練習)

  • 客戶端向伺服器寫字串(鍵盤錄入),伺服器(多執行緒)將字串反轉後寫回,客戶端再次讀取到是反轉後的字串

26.19_網路程式設計(練習)

  • 客戶端向伺服器上傳檔案

26.20_day26總結

  • 把今天的知識點總結一遍。