1. 程式人生 > >網路程式設計,三要素(IP、埠號、協議),Socket,UDP,TCP

網路程式設計,三要素(IP、埠號、協議),Socket,UDP,TCP

1.網路程式設計概述(瞭解)

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

2.網路程式設計三要素之IP概述(掌握)

        IP    網際網路協議(Internet Protocol)
  • 每個裝置在網路中的唯一標識
  • 每臺網絡終端在網路中都有一個獨立的地址,我們在網路中傳輸資料就是使用這個地址。
  • 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

3.網路程式設計三要素之埠號概述(掌握)

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

4.網路程式設計三要素協議(掌握)

  • 為計算機網路中進行資料交換而建立的規則、標準或約定的集合。
  • UDP
    * 使用者資料報協議(User Datagram Protocol)
    • 面向無連線,資料不安全,速度快。不區分客戶端與服務端。
  • TCP
    * 傳輸控制協議(Transmission Control Protocol)
      * 面向連線(三次握手),資料安全,速度略低。分為客戶端和服務端。
    • 三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸資料

5.Socket通訊原理圖解(瞭解)

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

6.UDP傳輸(瞭解)

        使用者資料報協議(User Datagram Protocol)

* 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();

7.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();
    

8.TCP協議(掌握)

        傳輸控制協議(Transmission Control Protocol)

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

9.服務端是多執行緒的(掌握)

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("Hello");
                    System.out.println(br.readLine());
                    ps.println("你好");
                    System.out.println(br.readLine());
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}